diff --git a/.env b/.env index 7106445..dea7890 100644 --- a/.env +++ b/.env @@ -1,6 +1,16 @@ +# --- Discord --- TOKEN=MTQ1MjQxMzYyMjczODM1ODMyMw.GRRuIh.Cm--nT3CJuGgGZZoq8-70mL9GPMVlMFUzgDzGs CLIENT_ID=1452413622738358323 GUILD_ID=1452413993841856544 -MODERATOR_IDS=361526553940721684,1013868393218183268 CLIENT_SECRET=hNpxmzNWwVaRGCYVquKNGuNi7Z6CnX7t -DISCORD_CALLBACK_URL=http://localhost:3000/auth/discord/callback \ No newline at end of file +DISCORD_CALLBACK_URL=http://localhost:3000/auth/discord/callback +DISCORD_PUBLIC_CALLBACK_URL=https://transcript.syxpi.fr/auth/discord/callback + +# --- Base de Données --- +DB_HOST=192.168.1.6 +DB_USER=bot +DB_PASSWORD='NxKr63LJB65pHv%t7E$JqgxKRsZMw%VIHEZAjq%^O0KYKjW#cRc^ebIH@%S9kaTh*GIg^D3ai4KBjMeXEh6xwv#9afQIR2$!2UB8C3ToXjnYFmzR%$lfpshnf8g@8229' +DB_NAME=bot + +# --- Autres --- +MODERATOR_IDS=361526553940721684,1013868393218183268,929793784093495306 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 34f9770..2d7ec5c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,2 @@ -config.json -transcripts/ .env node_modules/ diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index 9fb3f76..3e0e071 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -1,27 +1,13 @@ - - sqlite.xerial + + mysql.8 true - org.sqlite.JDBC - jdbc:sqlite:bans.db + true + com.mysql.cj.jdbc.Driver + jdbc:mysql://192.168.1.6:3306 $ProjectFileDir$ - - sqlite.xerial - true - org.sqlite.JDBC - jdbc:sqlite:$PROJECT_DIR$/bans.db - $ProjectFileDir$ - - - file://$APPLICATION_CONFIG_DIR$/jdbc-drivers/Xerial SQLiteJDBC/3.45.1/org/xerial/sqlite-jdbc/3.45.1.0/sqlite-jdbc-3.45.1.0.jar - - - file://$APPLICATION_CONFIG_DIR$/jdbc-drivers/Xerial SQLiteJDBC/3.45.1/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar - - - \ No newline at end of file diff --git a/.idea/data_source_mapping.xml b/.idea/data_source_mapping.xml index e0aa78a..7476762 100644 --- a/.idea/data_source_mapping.xml +++ b/.idea/data_source_mapping.xml @@ -1,7 +1,21 @@ - - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/femboy-france-bot.iml b/.idea/femboy-france-bot.iml index 24643cc..9f7ba11 100644 --- a/.idea/femboy-france-bot.iml +++ b/.idea/femboy-france-bot.iml @@ -8,5 +8,6 @@ + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 0de88a0..3ed4fe9 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -1,7 +1,11 @@ \ No newline at end of file diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml index d23208f..544bde3 100644 --- a/.idea/jsLibraryMappings.xml +++ b/.idea/jsLibraryMappings.xml @@ -1,6 +1,7 @@ + \ No newline at end of file diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml index 479ef58..3c53f80 100644 --- a/.idea/sqldialects.xml +++ b/.idea/sqldialects.xml @@ -1,12 +1,14 @@ - - - + + + + + \ No newline at end of file diff --git a/README.md b/README.md index f544e00..57cb757 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,90 @@ -Temps de Projet Femboy-France-Bot (Ancien nom): [![wakatime](https://wakatime.com/badge/user/82e1aed9-c281-4a7b-9909-1dfb8022b027/project/30e19ddc-4559-496e-8632-68eebdbc5450.svg)](https://wakatime.com/badge/user/82e1aed9-c281-4a7b-9909-1dfb8022b027/project/30e19ddc-4559-496e-8632-68eebdbc5450) +# 🥐 Femboy Croissant Bot -Temps de Projet France-Femboy-Bot (Actuel): [![wakatime](https://wakatime.com/badge/user/82e1aed9-c281-4a7b-9909-1dfb8022b027/project/e30f3a7a-bda3-4fcf-9580-e57b6463ccab.svg)](https://wakatime.com/badge/user/82e1aed9-c281-4a7b-9909-1dfb8022b027/project/e30f3a7a-bda3-4fcf-9580-e57b6463ccab) +Un bot Discord complet et moderne pour la gestion de communauté, incluant modération, système d'XP, tickets avec transcription web, et plus encore. + +## 🌟 Fonctionnalités + +### 🛡️ Modération +- **Sanctions complètes :** Ban, Kick, Mute (Timeout), Warn. +- **Gestion des sanctions :** `unban`, `unmute`, `untimeout`, `changesanction`, `revokesanction`. +- **Logs détaillés :** Toutes les actions sont enregistrées en base de données et dans un salon de logs. +- **Casier judiciaire :** Visualisez l'historique des sanctions d'un membre avec `/casier`. +- **Auto-Unban/Unmute :** Gestion automatique des expirations de sanctions. + +### 🎫 Système de Tickets +- **Types multiples :** Support, Plainte, Candidature, etc. +- **Transcriptions Web :** Génération automatique de pages HTML pour les archives de tickets. +- **Dashboard Web :** Interface pour visualiser et gérer les transcripts (avec authentification Discord). +- **Candidatures :** Formulaire intégré avec questions personnalisées. + +### 📈 Système d'XP +- **Progression :** Gain d'XP par message et en vocal. +- **Niveaux :** Annonces de level-up personnalisées. +- **Classement :** Leaderboard global avec `/leaderboard`. +- **Exclusion :** Possibilité d'exclure certains salons du gain d'XP. +- **Bumps :** Récompenses d'XP pour les bumps (Disboard) et rappels automatiques. + +### 🛠️ Utilitaires +- **Info :** `/userinfo`, `/serverinfo`, `/profil`. +- **Profils personnalisables :** Signature, anniversaire, badges (détection automatique Nitro/Boost). +- **Dev :** Commandes de maintenance (`/reload`, `/infra`). + +## 🚀 Installation + +### Prérequis +- Node.js v16.9.0 ou supérieur. +- Une base de données MySQL/MariaDB. +- Un bot Discord créé sur le [Developer Portal](https://discord.com/developers/applications). + +### Configuration +1. Clonez le dépôt. +2. Installez les dépendances : + ```bash + npm install + ``` +3. Configurez le fichier `.env` (voir `.env.example` ou ci-dessous) : + ```env + TOKEN=votre_token_bot + CLIENT_ID=votre_client_id + GUILD_ID=id_serveur_principal + + DB_HOST=localhost + DB_USER=root + DB_PASSWORD=votre_mot_de_passe + DB_NAME=bot + + DISCORD_CLIENT_SECRET=votre_secret_oauth + DISCORD_CALLBACK_URL=http://localhost:3000/auth/discord/callback + TRANSCRIPT_PORT=3000 + MODERATOR_IDS=id1,id2 + ``` + +### Démarrage +1. Déployez les commandes Slash : + ```bash + npm run deploy + ``` +2. Lancez le bot : + ```bash + npm start + ``` +3. (Optionnel) Lancez le serveur de transcripts : + ```bash + npm run server + ``` + +## 📂 Structure du Projet + +- `/commands` : Commandes Slash organisées par catégorie. +- `/events` : Gestionnaires d'événements Discord (message, interaction, vocal...). +- `/functions` : Logique métier (DB, XP, Modération). +- `/server` : Serveur web Express pour les transcripts. +- `/utils` : Constantes et fonctions utilitaires. + +## 🔒 Sécurité +- Les tokens et mots de passe ne doivent **jamais** être partagés. +- Le fichier `.env` est ignoré par Git. +- Le serveur web utilise l'authentification OAuth2 Discord pour protéger les transcripts. + +--- +*Développé avec ❤️ par Syxpi* \ No newline at end of file diff --git a/VERIFIED.md b/VERIFIED.md new file mode 100644 index 0000000..77f13fa --- /dev/null +++ b/VERIFIED.md @@ -0,0 +1,94 @@ +# État de Vérification du Projet + +Ce fichier recense les fichiers du projet et leur état de vérification/correction. + +## Légende +- ✅ : Vérifié et corrigé (si nécessaire) +- ❌ : Non vérifié ou nécessite attention +- ⚠️ : Vérifié mais des améliorations sont possibles + +## Structure du Projet + +### Racine +- ✅ `index.js` : Gestion des erreurs de chargement ajoutée. +- ✅ `VERIFIED.md` : Ce fichier. +- ✅ `deploy-commands.js` : Vérifié, script robuste. +- ✅ `eslint.config.js` : Vérifié. +- ✅ `package.json` : Vérifié. +- ✅ `README.md` : Documentation complète ajoutée. +- ✅ `.env.example` : Vérifié (et `.env` configuré manuellement). +- ✅ `.gitignore` : Vérifié. + +### Events (`/events`) +- ✅ `interactionCreate.js` : Gestion des erreurs globale + correction imports + MessageFlags. +- ✅ `messageCreate.js` : Refactorisation, nettoyage logique XP/Bump/Tickets. +- ✅ `ready.js` : Vérifié, RAS. +- ✅ `voiceStateUpdate.js` : Refonte complète de la logique des timers. + +### Commands (`/commands`) + +#### Ticket (`/commands/ticket`) +- ✅ `ticket.js` : Imports corrigés, timestamp SQL ajouté, MessageFlags, suppression modal delete, fix timestamp candidature, embed amélioré, transcript auto, fix chemin DB. + +#### Utility (`/commands/utility`) +- ✅ `ping.js` : Correction warning `fetchReply`. +- ✅ `avatar.js` : Vérifié, RAS. + +#### XP (`/commands/xp`) +- ✅ `bumptime.js` : Nettoyage, MessageFlags. +- ✅ `leaderboard.js` : Nettoyage, optimisation. +- ✅ `level.js` : Nettoyage, MessageFlags, formatage temps vocal. +- ✅ `resetlevel.js` : Nettoyage, MessageFlags. +- ✅ `xpexclude.js` : Nettoyage, MessageFlags. + +#### Moderation (`/commands/moderation`) +- ✅ `ban.js` : Nettoyage, MessageFlags, gestion erreurs. +- ✅ `casier.js` : Nettoyage, MessageFlags, pagination. +- ✅ `changemute.js` : Nettoyage, MessageFlags. +- ✅ `changesanction.js` : Nettoyage, MessageFlags. +- ✅ `clear.js` : Nettoyage, MessageFlags. +- ✅ `kick.js` : Nettoyage, MessageFlags. +- ✅ `mute.js` : Nettoyage, MessageFlags. +- ✅ `mysanctions.js` : Nettoyage, MessageFlags. +- ✅ `purge.js` : Nettoyage, MessageFlags. +- ✅ `revokesanction.js` : Nettoyage, MessageFlags. +- ✅ `unban.js` : Nettoyage, MessageFlags. +- ✅ `unmute.js` : Nettoyage, MessageFlags. +- ✅ `untimeout.js (Disabled)` : Nettoyage, MessageFlags. +- ✅ `warn.js` : Nettoyage, MessageFlags. + +#### Info (`/commands/info`) +- ✅ `adminprofil.js` : Nettoyage, MessageFlags. +- ✅ `embed.js` : Nettoyage. +- ✅ `info.js` : Nettoyage. +- ✅ `profil.js` : Nettoyage, MessageFlags, optimisation badges, nouveaux champs (anniversaire, couleur, etc.), validation dates. +- ✅ `serverinfo.js` : Nettoyage, traduction statuts. +- ✅ `userinfo.js` : Nettoyage, optimisation rôles. + +#### Dev (`/commands/dev`) +- ✅ `infra.js` : Nettoyage. +- ✅ `reload.js` : Nettoyage, MessageFlags. + +### Functions (`/functions`) + +#### Database (`/functions/database`) +- ✅ `db.js` : Nettoyage, sécurisation mot de passe (via env), migrations robustes (sans IF NOT EXISTS), nouvelles colonnes profil. + +#### XP (`/functions/xp`) +- ✅ `xp.js` : Vérifié, logique OK. + +#### Moderation (`/functions/moderation`) +- ✅ `autoUnban.js` : Nettoyage. +- ✅ `autoUnmute.js` : Nettoyage. + +#### Bump (`/functions/bump`) +- ✅ `bumpReminder.js` : Nettoyage, correction requête SQL. + +### Server (`/server`) +- ✅ `transcript-server.js` : Nettoyage, fix CSS (routes wildcard), logs debug, design moderne Dark Theme, filtrage JS. +- ✅ `README.md` : Vérifié. +- ✅ `public/transcript.css` : Design moderne Dark Theme. + +### Utils (`/utils`) +- ✅ `constants.js` : Vérifié. +- ✅ `helpers.js` : Vérifié. diff --git a/commands/dev/infra.js b/commands/dev/infra.js index 4b416ba..0fcef7e 100644 --- a/commands/dev/infra.js +++ b/commands/dev/infra.js @@ -2,59 +2,53 @@ const os = require('os'); const fs = require('fs'); const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits } = require('discord.js'); const { formatUptime } = require('../../utils/helpers'); +const { colors } = require('../../utils/constants'); function getOS() { - const platform = os.platform(); - const release = os.release(); - switch (platform) { - case 'win32': - return `Windows ${release}`; - case 'darwin': - return `macOS ${release}`; - case 'linux': - try { - const data = fs.readFileSync('/etc/os-release', 'utf8'); - const match = data.match(/PRETTY_NAME="(.+)"/); - if (match) return `${match[1]} (kernel ${release})`; - } catch { - return `Linux ${release}`; - } - default: - return `${platform} ${release}`; - } + const platform = os.platform(); + const release = os.release(); + switch (platform) { + case 'win32': return `Windows ${release}`; + case 'darwin': return `macOS ${release}`; + case 'linux': + try { + const data = fs.readFileSync('/etc/os-release', 'utf8'); + const match = data.match(/PRETTY_NAME="(.+)"/); + if (match) return `${match[1]} (kernel ${release})`; + } catch { return `Linux ${release}`; } + default: return `${platform} ${release}`; + } } module.exports = { - category: 'dev', - data: new SlashCommandBuilder() - .setName('infra') - .setDescription('Voir l\'infrastructure du bot') - .setDefaultMemberPermissions(PermissionFlagsBits.Administrator), - async execute(interaction) { - const cpuInfo = os.cpus()[0].model; - const cpuCores = os.cpus().length; - const totalRAM = (os.totalmem() / (1024 ** 3)).toFixed(2); - const freeRAM = (os.freemem() / (1024 ** 3)).toFixed(2); - const usedRAM = (totalRAM - freeRAM).toFixed(2); - const ramUsagePercent = ((usedRAM / totalRAM) * 100).toFixed(1); - const uptime = os.uptime(); + category: 'dev', + data: new SlashCommandBuilder() + .setName('infra') + .setDescription('Voir l\'infrastructure du bot') + .setDefaultMemberPermissions(PermissionFlagsBits.Administrator), + async execute(interaction) { + const cpuInfo = os.cpus()[0].model; + const cpuCores = os.cpus().length; + const totalRAM = (os.totalmem() / (1024 ** 3)).toFixed(2); + const freeRAM = (os.freemem() / (1024 ** 3)).toFixed(2); + const usedRAM = (totalRAM - freeRAM).toFixed(2); + const ramUsagePercent = ((usedRAM / totalRAM) * 100).toFixed(1); + const uptime = os.uptime(); - const { colors } = require('../../utils/constants'); + const embed = new EmbedBuilder() + .setTitle('🖥️ Infrastructure du Bot') + .setColor(colors.info) + .addFields( + { name: '💻 CPU', value: `${cpuInfo}\n${cpuCores} cœurs`, inline: true }, + { name: '💾 RAM', value: `${usedRAM} Go / ${totalRAM} Go\n${ramUsagePercent}% utilisée`, inline: true }, + { name: '🖥️ OS', value: getOS(), inline: true }, + { name: '⏱️ Uptime Système', value: formatUptime(uptime), inline: true }, + { name: '📊 Node.js', value: process.version, inline: true }, + { name: '📦 Architecture', value: os.arch(), inline: true } + ) + .setFooter({ text: interaction.client.user.username, iconURL: interaction.client.user.displayAvatarURL() }) + .setTimestamp(); - const embed = new EmbedBuilder() - .setTitle('🖥️ Infrastructure du Bot') - .setColor(colors.info) - .addFields( - { name: '💻 CPU', value: `${cpuInfo}\n${cpuCores} cœurs`, inline: true }, - { name: '💾 RAM', value: `${usedRAM} Go / ${totalRAM} Go\n${ramUsagePercent}% utilisée`, inline: true }, - { name: '🖥️ OS', value: getOS(), inline: true }, - { name: '⏱️ Uptime Système', value: formatUptime(uptime), inline: true }, - { name: '📊 Node.js', value: process.version, inline: true }, - { name: '📦 Architecture', value: os.arch(), inline: true } - ) - .setFooter({ text: interaction.client.user.username, iconURL: interaction.client.user.displayAvatarURL() }) - .setTimestamp(); - - await interaction.reply({ embeds: [embed] }); - }, -}; + await interaction.reply({ embeds: [embed] }); + }, +}; \ No newline at end of file diff --git a/commands/dev/reload.js b/commands/dev/reload.js index d9cd11b..fffdab2 100644 --- a/commands/dev/reload.js +++ b/commands/dev/reload.js @@ -1,36 +1,40 @@ -const { SlashCommandBuilder, PermissionFlagsBits } = require('discord.js'); +const { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } = require('discord.js'); module.exports = { - category: 'dev', - data: new SlashCommandBuilder() - .setName('reload') - .setDescription('Recharge une commande.') - .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) - .addStringOption(option => - option.setName('command') - .setDescription('La commande à recharger.') - .setRequired(true)), - async execute(interaction) { - if (!interaction.member.permissions.has(PermissionFlagsBits.Administrator)) { - return interaction.reply({ content: '❌ Seuls les administrateurs peuvent utiliser cette commande.', ephemeral: true }); - } + category: 'dev', + data: new SlashCommandBuilder() + .setName('reload') + .setDescription('Recharge une commande.') + .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) + .addStringOption(option => + option.setName('command') + .setDescription('La commande à recharger.') + .setRequired(true)), + async execute(interaction) { + if (!interaction.member.permissions.has(PermissionFlagsBits.Administrator)) { + return interaction.reply({ content: '❌ Seuls les administrateurs peuvent utiliser cette commande.', flags: MessageFlags.Ephemeral }); + } - const commandName = interaction.options.getString('command', true).toLowerCase(); - const command = interaction.client.commands.get(commandName); + const commandName = interaction.options.getString('command', true).toLowerCase(); + const command = interaction.client.commands.get(commandName); - if (!command) { - return interaction.reply({ content: `❌ Aucune commande nommée \`${commandName}\` n'a été trouvée !`, ephemeral: true }); - } + if (!command) { + return interaction.reply({ content: `❌ Aucune commande nommée \`${commandName}\` n'a été trouvée !`, flags: MessageFlags.Ephemeral }); + } - delete require.cache[require.resolve(`../${command.category}/${command.data.name}.js`)]; + try { + // Supprimer du cache + const commandPath = `../${command.category}/${command.data.name}.js`; + delete require.cache[require.resolve(commandPath)]; - try { - const newCommand = require(`../${command.category}/${command.data.name}.js`); - interaction.client.commands.set(newCommand.data.name, newCommand); - await interaction.reply({ content: `✅ Commande \`${newCommand.data.name}\` rechargée avec succès !`, ephemeral: true }); - } catch (error) { - console.error(error); - await interaction.reply({ content: `❌ Erreur lors du rechargement de \`${command.data.name}\`:\n\`${error.message}\``, ephemeral: true }); - } - }, -}; + // Recharger + const newCommand = require(commandPath); + interaction.client.commands.set(newCommand.data.name, newCommand); + + await interaction.reply({ content: `✅ Commande \`${newCommand.data.name}\` rechargée avec succès !`, flags: MessageFlags.Ephemeral }); + } catch (error) { + console.error(error); + await interaction.reply({ content: `❌ Erreur lors du rechargement de \`${command.data.name}\`:\n\`${error.message}\``, flags: MessageFlags.Ephemeral }); + } + }, +}; \ No newline at end of file diff --git a/commands/info/adminprofil.js b/commands/info/adminprofil.js index 4b44235..1105bd3 100644 --- a/commands/info/adminprofil.js +++ b/commands/info/adminprofil.js @@ -1,133 +1,119 @@ -const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits } = require('discord.js'); +const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); const { colors } = require('../../utils/constants'); const { sendLog } = require('../../utils/helpers'); module.exports = { - category: 'info', - data: new SlashCommandBuilder() - .setName('adminprofil') - .setDescription('Administrer les profils utilisateurs (Admin uniquement)') - .addSubcommand(subcommand => - subcommand - .setName('reset') - .setDescription('Réinitialiser le profil d\'un utilisateur') - .addUserOption(option => - option.setName('user') - .setDescription('L\'utilisateur dont tu veux réinitialiser le profil') - .setRequired(true)) - .addStringOption(option => - option.setName('type') - .setDescription('Ce qui doit être réinitialisé') - .setRequired(true) - .addChoices( - { name: 'Signature', value: 'signature' }, - { name: 'Tout le profil', value: 'all' } - )) - .addStringOption(option => - option.setName('reason') - .setDescription('Raison de la réinitialisation') - .setRequired(false))), - async execute(interaction) { - await interaction.deferReply({ ephemeral: true }); - - // Vérifier les permissions (Admin uniquement) - if (!interaction.member.permissions.has(PermissionFlagsBits.Administrator)) { - return interaction.editReply({ - content: '❌ Tu n\'as pas la permission d\'utiliser cette commande. (Administrateur requis)' - }); - } - - const subcommand = interaction.options.getSubcommand(); - - if (subcommand === 'reset') { - const target = interaction.options.getUser('user'); - const resetType = interaction.options.getString('type'); - const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; - - if (!target) { - return interaction.editReply({ - content: '❌ Aucun utilisateur spécifié !' - }); - } - - try { - // Récupérer le profil actuel - const [profiles] = await db.query( - 'SELECT * FROM user_profiles WHERE userId = ? AND guildId = ?', - [target.id, interaction.guild.id] - ); - - if (profiles.length === 0) { - return interaction.editReply({ - content: `❌ ${target.tag} n'a pas de profil à réinitialiser.` - }); - } - - const profile = profiles[0]; - - if (resetType === 'signature') { - // Réinitialiser uniquement la signature - await db.query( - 'UPDATE user_profiles SET signature = NULL, updatedAt = ? WHERE userId = ? AND guildId = ?', - [Date.now(), target.id, interaction.guild.id] - ); - - const embed = new EmbedBuilder() - .setTitle('✅ Signature Réinitialisée') - .setColor(colors.success) - .setDescription(`La signature de ${target.toString()} a été réinitialisée.`) - .addFields( - { name: '👤 Utilisateur', value: `${target.tag}`, inline: true }, - { name: '📝 Raison', value: reason, inline: false } - ) - .setTimestamp(); - - await interaction.editReply({ embeds: [embed] }); - - } else if (resetType === 'all') { - // Réinitialiser tout le profil - await db.query( - 'DELETE FROM user_profiles WHERE userId = ? AND guildId = ?', - [target.id, interaction.guild.id] - ); - - const embed = new EmbedBuilder() - .setTitle('✅ Profil Réinitialisé') - .setColor(colors.success) - .setDescription(`Le profil de ${target.toString()} a été complètement réinitialisé.`) - .addFields( - { name: '👤 Utilisateur', value: `${target.tag}`, inline: true }, - { name: '📝 Raison', value: reason, inline: false } - ) - .setTimestamp(); - - await interaction.editReply({ embeds: [embed] }); - } - - // Logger l'action - const logEmbed = new EmbedBuilder() - .setTitle('🔄 Profil Réinitialisé (Admin)') - .setColor(colors.warning) - .setDescription(`Le profil de ${target.toString()} a été réinitialisé.`) - .addFields( - { name: '👤 Utilisateur', value: `${target.tag} (${target.id})`, inline: true }, - { name: '⚙️ Admin', value: `${interaction.user.tag} (${interaction.user.id})`, inline: true }, - { name: '🔄 Type', value: resetType === 'signature' ? 'Signature' : 'Tout le profil', inline: true }, - { name: '📝 Raison', value: reason, inline: false } - ) - .setFooter({ text: 'France Femboy Bot • Administration' }) - .setTimestamp(); - - await sendLog(interaction.guild, logEmbed); - - } catch (err) { - console.error('Erreur lors de la réinitialisation du profil:', err); - await interaction.editReply({ - content: `❌ Erreur lors de la réinitialisation du profil: ${err.message}` - }); - } - } - }, -}; - + category: 'info', + data: new SlashCommandBuilder() + .setName('adminprofil') + .setDescription('Administrer les profils utilisateurs (Admin uniquement)') + .addSubcommand(subcommand => + subcommand + .setName('reset') + .setDescription('Réinitialiser le profil d\'un utilisateur') + .addUserOption(option => + option.setName('user') + .setDescription('L\'utilisateur dont tu veux réinitialiser le profil') + .setRequired(true)) + .addStringOption(option => + option.setName('type') + .setDescription('Ce qui doit être réinitialisé') + .setRequired(true) + .addChoices( + { name: 'Signature', value: 'signature' }, + { name: 'Tout le profil', value: 'all' } + )) + .addStringOption(option => + option.setName('reason') + .setDescription('Raison de la réinitialisation') + .setRequired(false))), + async execute(interaction) { + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); + + if (!interaction.member.permissions.has(PermissionFlagsBits.Administrator)) { + return interaction.editReply({ + content: '❌ Tu n\'as pas la permission d\'utiliser cette commande. (Administrateur requis)' + }); + } + + const subcommand = interaction.options.getSubcommand(); + + if (subcommand === 'reset') { + const target = interaction.options.getUser('user'); + const resetType = interaction.options.getString('type'); + const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; + + if (!target) return interaction.editReply({ content: '❌ Aucun utilisateur spécifié !' }); + + try { + const [profiles] = await db.query( + 'SELECT * FROM user_profiles WHERE userId = ? AND guildId = ?', + [target.id, interaction.guild.id] + ); + + if (profiles.length === 0) { + return interaction.editReply({ + content: `❌ ${target.tag} n'a pas de profil à réinitialiser.` + }); + } + + if (resetType === 'signature') { + await db.query( + 'UPDATE user_profiles SET signature = NULL, updatedAt = ? WHERE userId = ? AND guildId = ?', + [Date.now(), target.id, interaction.guild.id] + ); + + const embed = new EmbedBuilder() + .setTitle('✅ Signature Réinitialisée') + .setColor(colors.success) + .setDescription(`La signature de ${target.toString()} a été réinitialisée.`) + .addFields( + { name: '👤 Utilisateur', value: `${target.tag}`, inline: true }, + { name: '📝 Raison', value: reason, inline: false } + ) + .setTimestamp(); + + await interaction.editReply({ embeds: [embed] }); + + } else if (resetType === 'all') { + await db.query( + 'DELETE FROM user_profiles WHERE userId = ? AND guildId = ?', + [target.id, interaction.guild.id] + ); + + const embed = new EmbedBuilder() + .setTitle('✅ Profil Réinitialisé') + .setColor(colors.success) + .setDescription(`Le profil de ${target.toString()} a été complètement réinitialisé.`) + .addFields( + { name: '👤 Utilisateur', value: `${target.tag}`, inline: true }, + { name: '📝 Raison', value: reason, inline: false } + ) + .setTimestamp(); + + await interaction.editReply({ embeds: [embed] }); + } + + const logEmbed = new EmbedBuilder() + .setTitle('🔄 Profil Réinitialisé (Admin)') + .setColor(colors.warning) + .setDescription(`Le profil de ${target.toString()} a été réinitialisé.`) + .addFields( + { name: '👤 Utilisateur', value: `${target.tag} (${target.id})`, inline: true }, + { name: '⚙️ Admin', value: `${interaction.user.tag} (${interaction.user.id})`, inline: true }, + { name: '🔄 Type', value: resetType === 'signature' ? 'Signature' : 'Tout le profil', inline: true }, + { name: '📝 Raison', value: reason, inline: false } + ) + .setFooter({ text: 'Femboy Croissant Bot • Administration' }) + .setTimestamp(); + + await sendLog(interaction.guild, { embeds: [logEmbed] }); + + } catch (err) { + console.error('Erreur adminprofil:', err); + await interaction.editReply({ content: `❌ Erreur: ${err.message}` }); + } + } + }, +}; \ No newline at end of file diff --git a/commands/info/embed.js b/commands/info/embed.js index e923b5f..e1fca46 100644 --- a/commands/info/embed.js +++ b/commands/info/embed.js @@ -1,45 +1,43 @@ const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits } = require('discord.js'); module.exports = { - category: 'info', - data: new SlashCommandBuilder() - .setName('embed') - .setDescription('Créer un embed personnalisé.') - .addStringOption(option => - option.setName('title') - .setDescription('Titre de l\'embed') - .setRequired(true)) - .addStringOption(option => - option.setName('description') - .setDescription('Description de l\'embed') - .setRequired(true)) - .addStringOption(option => - option.setName('color') - .setDescription('Couleur de l\'embed (hex, ex: #FF0000)') - .setRequired(false)) - .setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages), - async execute(interaction) { - const title = interaction.options.getString('title'); - const description = interaction.options.getString('description'); - const colorInput = interaction.options.getString('color'); + category: 'info', + data: new SlashCommandBuilder() + .setName('embed') + .setDescription('Créer un embed personnalisé.') + .addStringOption(option => + option.setName('title') + .setDescription('Titre de l\'embed') + .setRequired(true)) + .addStringOption(option => + option.setName('description') + .setDescription('Description de l\'embed') + .setRequired(true)) + .addStringOption(option => + option.setName('color') + .setDescription('Couleur de l\'embed (hex, ex: #FF0000)') + .setRequired(false)) + .setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages), + async execute(interaction) { + const title = interaction.options.getString('title'); + const description = interaction.options.getString('description'); + const colorInput = interaction.options.getString('color'); - let color = 0x5865F2; // Couleur par défaut (bleu Discord) - if (colorInput) { - // Parser la couleur hex - const hexMatch = colorInput.match(/^#?([0-9A-Fa-f]{6})$/); - if (hexMatch) { - color = parseInt(hexMatch[1], 16); - } - } + let color = 0x5865F2; + if (colorInput) { + const hexMatch = colorInput.match(/^#?([0-9A-Fa-f]{6})$/); + if (hexMatch) { + color = parseInt(hexMatch[1], 16); + } + } - const embed = new EmbedBuilder() - .setTitle(title) - .setDescription(description) - .setColor(color) - .setFooter({ text: `Créé par ${interaction.user.tag}`, iconURL: interaction.user.displayAvatarURL() }) - .setTimestamp(); - - await interaction.reply({ embeds: [embed] }); - }, -}; + const embed = new EmbedBuilder() + .setTitle(title) + .setDescription(description) + .setColor(color) + .setFooter({ text: `Créé par ${interaction.user.tag}`, iconURL: interaction.user.displayAvatarURL() }) + .setTimestamp(); + await interaction.reply({ embeds: [embed] }); + }, +}; \ No newline at end of file diff --git a/commands/info/info.js b/commands/info/info.js index 79b6f26..4269f15 100644 --- a/commands/info/info.js +++ b/commands/info/info.js @@ -1,65 +1,62 @@ const { SlashCommandBuilder, EmbedBuilder } = require('discord.js'); const { formatUptime } = require('../../utils/helpers'); +const { colors } = require('../../utils/constants'); module.exports = { - category: 'info', - data: new SlashCommandBuilder() - .setName('info') - .setDescription('Obtenir les informations du bot'), - async execute(interaction) { - const { colors, emojis } = require('../../utils/constants'); - const uptime = formatUptime(process.uptime()); - - const embed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.client.user.username}`, - iconURL: interaction.client.user.displayAvatarURL() - }) - .setTitle('📝 Informations du Bot') - .setColor(colors.info) - .setThumbnail(interaction.client.user.displayAvatarURL({ dynamic: true, size: 256 })) - .addFields( - { - name: '👩‍💻 Développeuse Principale', - value: '<@361526553940721684>', - inline: true - }, - { - name: '🧠 Langages et environnement', - value: [ - '• **Langage :** <:JavaScript:1425179797692092506> JavaScript (ECMAScript 2024)', - '• **Backend :** <:NodeJS:1425179878252089435> Node.js v22.21.0', - '• **Librairies :** <:DiscordJS:1425179852536938670> Discord.js v14.22.1', - '• **IDE :** <:WebStorm:1429190717066055841> JetBrains WebStorm 2025.2.3', - ].join('\n'), - inline: false - }, - { - name: '💡 Date de création', - value: '20 Août 2025', - inline: true - }, - { - name: '⏱️ Uptime', - value: uptime, - inline: true - }, - { - name: '📊 Statistiques', - value: [ - `• **Serveurs :** ${interaction.client.guilds.cache.size}`, - `• **Utilisateurs :** ${interaction.client.guilds.cache.reduce((acc, guild) => acc + guild.memberCount, 0)}`, - `• **Commandes :** ${interaction.client.commands.size}`, - ].join('\n'), - inline: false - } - ) - .setFooter({ - text: `${interaction.guild.name} • Made with love by Syxpi 💞`, - iconURL: interaction.client.user.displayAvatarURL() - }) - .setTimestamp(); + category: 'info', + data: new SlashCommandBuilder() + .setName('info') + .setDescription('Obtenir les informations du bot'), + async execute(interaction) { + const uptime = formatUptime(process.uptime()); - await interaction.reply({ embeds: [embed] }); - }, -}; + const embed = new EmbedBuilder() + .setAuthor({ + name: `Système d'Information • ${interaction.client.user.username}`, + iconURL: interaction.client.user.displayAvatarURL() + }) + .setColor(colors.info) + .setThumbnail(interaction.client.user.displayAvatarURL({dynamic: true, size: 256})) + .setDescription('Voici les détails techniques et statistiques concernant mon fonctionnement actuel.') + .addFields( + { + name: '👑 Propriétaire', + value: `> <@361526553940721684> (Lumi)`, + inline: true + }, + { + name: '⌛ En ligne depuis', + value: `> \`${uptime}\``, + inline: true + }, + { + name: '🛠️ Stack Technique', + value: [ + '```yml', + 'Langage: JavaScript (ES2024)', + 'Runtime: Node.js v25.2.1', + 'Library: Discord.js v14.22.1', + 'IDE: JetBrains WebStorm', + '```' + ].join('\n'), + inline: false + }, + { + name: '📈 Statistiques Globales', + value: [ + `• **Guildes:** \`${interaction.client.guilds.cache.size}\``, + `• **Membres:** \`${interaction.client.guilds.cache.reduce((acc, guild) => acc + guild.memberCount, 0)}\``, + `• **Commandes:** \`${interaction.client.commands.size}\``, + ].join('\n'), + inline: true + } + ) + .setFooter({ + text: `Femboy Croissant Bot • Développé avec passion par Lumi 💞`, + iconURL: interaction.client.user.displayAvatarURL() + }) + .setTimestamp(); + + await interaction.reply({embeds: [embed]}); + }, +}; \ No newline at end of file diff --git a/commands/info/profil.js b/commands/info/profil.js index e730db6..a0d9855 100644 --- a/commands/info/profil.js +++ b/commands/info/profil.js @@ -1,579 +1,334 @@ -const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits } = require('discord.js'); +const { SlashCommandBuilder, EmbedBuilder, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); -const { getUserXP } = require('../../functions/xp/xp.js'); +const { getUserXP, getUserRank } = require('../../functions/xp/xp.js'); const { colors } = require('../../utils/constants'); -// Mapping des emojis personnalisés pour les badges Discord -// Format: <:nom_emoji:ID> const BADGE_EMOJIS = { - // Badges généraux (utiliser des emojis Unicode par défaut si pas d'emoji personnalisé fourni) - 'staff': '👨‍💼', // Discord Staff (pas d'emoji fourni dans la liste) - 'partner': '<:discord_partener:1437046788916904097>', // Partner - 'hypesquad': '<:hypesquad_balance:1437046792922464337>', // HypeSquad (générique - utiliser Balance) - 'hypesquad_bravery': '<:hypesquad_bravery:1437046793899872467>', // HypeSquad Bravery - 'hypesquad_brilliance': '<:hypesquad_brilliance:1437046794868756550>', // HypeSquad Brilliance - 'hypesquad_balance': '<:hypesquad_balance:1437046792922464337>', // HypeSquad Balance - 'hypesquad_events': '<:hypesquad_events:1437046795778920448>', // HypeSquad Events - 'early_supporter': '<:early_supporter:1437046790087250071>', // Early Supporter - 'bug_hunter_level_1': '🐛', // Bug Hunter (pas d'emoji fourni) - 'bug_hunter_level_2': '🐛', // Bug Hunter Gold (pas d'emoji fourni) - 'verified_developer': '✅', // Verified Bot Developer (pas d'emoji fourni) - 'active_developer': '<:active_developer:1437049369936531587>', // Active Developer - 'certified_moderator': '🛡️', // Certified Moderator (pas d'emoji fourni) - 'bot_http_interactions': '🤖', // Bot HTTP Interactions (pas d'emoji fourni) - - // Badges Quests - 'quests': '<:quests:1437046809464934492>', // Quests - 'slash_commands': '<:slash_commands:1437046810458984553>', // Slash Commands - - // Badges Orbs - 'orbs': '<:orbs:1437046808185540628>', // Orbs - - // Badges Nitro (par durée) - 'nitro': '<:nitro:1437046796810715136>', // Nitro (base) - 'nitro_1_month': '<:nitro_1_month:1437046798685442241>', // Nitro 1 mois - 'nitro_3_months': '<:nitro_3_months:1437046801550278757>', // Nitro 3 mois - 'nitro_6_months': '<:nitro_6_months:1437046805102723143>', // Nitro 6 mois - 'nitro_1_year': '<:nitro_1_year:1437046799515783198>', // Nitro 1 an - 'nitro_2_years': '<:nitro_2_years:1437046800522416138>', // Nitro 2 ans - 'nitro_3_years': '<:nitro_3_years:1437046802519035924>', // Nitro 3 ans (Émeraude) - 'nitro_5_years': '<:nitro_5_years:1437046803747967016>', // Nitro 5 ans - 'nitro_6_years': '<:nitro_6_years:1437046806747021514>', // Nitro 6 ans - - // Badges Boost (par durée) - 'boost': '<:boost:1437046778083016745>', // Boost (base) - 'boost_2_months': '<:boost_2_months:1437046780322779266>', // Boost 2 mois - 'boost_3_months': '<:boost_3_months:1437046781375414383>', // Boost 3 mois - 'boost_6_months': '<:boost_6_months:1437046782247829616>', // Boost 6 mois - 'boost_9_months': '<:boost_9_months:1437046783070044200>', // Boost 9 mois - 'boost_12_months': '<:boost_12_months:1437046784445644930>', // Boost 12 mois - 'boost_15_months': '<:boost_15_months:1437046785402081281>', // Boost 15 mois - 'boost_18_months': '<:boost_18_months:1437046786643722342>', // Boost 18 mois - 'boost_24_months': '<:boost_24_months:1437046787667136612>', // Boost 24 mois + 'staff': '👨‍💼', + 'partner': '<:discord_partener:1437046788916904097>', + 'hypesquad': '<:hypesquad_balance:1437046792922464337>', + 'hypesquad_bravery': '<:hypesquad_bravery:1437046793899872467>', + 'hypesquad_brilliance': '<:hypesquad_brilliance:1437046794868756550>', + 'hypesquad_balance': '<:hypesquad_balance:1437046792922464337>', + 'hypesquad_events': '<:hypesquad_events:1437046795778920448>', + 'early_supporter': '<:early_supporter:1437046790087250071>', + 'bug_hunter_level_1': '🐛', + 'bug_hunter_level_2': '🐛', + 'verified_developer': '✅', + 'active_developer': '<:active_developer:1437049369936531587>', + 'certified_moderator': '🛡️', + 'bot_http_interactions': '🤖', + 'quests': '<:quests:1437046809464934492>', + 'slash_commands': '<:slash_commands:1437046810458984553>', + 'orbs': '<:orbs:1437046808185540628>', + 'nitro': '<:nitro:1437046796810715136>', + 'nitro_1_month': '<:nitro_1_month:1437046798685442241>', + 'nitro_3_months': '<:nitro_3_months:1437046801550278757>', + 'nitro_6_months': '<:nitro_6_months:1437046805102723143>', + 'nitro_1_year': '<:nitro_1_year:1437046799515783198>', + 'nitro_2_years': '<:nitro_2_years:1437046800522416138>', + 'nitro_3_years': '<:nitro_3_years:1437046802519035924>', + 'nitro_5_years': '<:nitro_5_years:1437046803747967016>', + 'nitro_6_years': '<:nitro_6_years:1437046806747021514>', + 'boost': '<:boost:1437046778083016745>', + 'boost_2_months': '<:boost_2_months:1437046780322779266>', + 'boost_3_months': '<:boost_3_months:1437046781375414383>', + 'boost_6_months': '<:boost_6_months:1437046782247829616>', + 'boost_9_months': '<:boost_9_months:1437046783070044200>', + 'boost_12_months': '<:boost_12_months:1437046784445644930>', + 'boost_15_months': '<:boost_15_months:1437046785402081281>', + 'boost_18_months': '<:boost_18_months:1437046786643722342>', + 'boost_24_months': '<:boost_24_months:1437046787667136612>', }; -// Fonction pour obtenir les badges Discord d'un utilisateur (emojis personnalisés) function getDiscordBadges(user, member) { - const badgeEmojis = []; - - // Badges de compte - utiliser toArray() qui retourne les noms des flags - if (user.flags) { - try { - const flagsArray = user.flags.toArray(); - - // Mapping des flags Discord.js vers les noms de badges - const flagToBadgeMap = { - 'Staff': 'staff', - 'Partner': 'partner', - 'HypeSquad': 'hypesquad', - 'HypeSquadOnlineHouse1': 'hypesquad_bravery', - 'HypeSquadOnlineHouse2': 'hypesquad_brilliance', - 'HypeSquadOnlineHouse3': 'hypesquad_balance', - 'HypeSquadEvents': 'hypesquad_events', - 'BugHunterLevel1': 'bug_hunter_level_1', - 'BugHunterLevel2': 'bug_hunter_level_2', - 'PremiumEarlySupporter': 'early_supporter', - 'VerifiedDeveloper': 'verified_developer', - 'ActiveDeveloper': 'active_developer', - 'CertifiedModerator': 'certified_moderator', - 'BotHTTPInteractions': 'bot_http_interactions', - 'Quests': 'quests', - 'QuestsEarly': 'quests', - 'SlashCommands': 'slash_commands', - }; - - // Note: Les logs de debug sont commentés pour réduire le bruit dans les logs - // Décommenter si besoin de debugger les flags - - // Vérifier chaque flag présent et ajouter l'emoji - for (const flag of flagsArray) { - const flagLower = flag.toLowerCase(); - const badgeKey = flagToBadgeMap[flag]; - - // Si le flag est dans le mapping direct, l'utiliser - if (badgeKey && BADGE_EMOJIS[badgeKey]) { - badgeEmojis.push(BADGE_EMOJIS[badgeKey]); - continue; - } - - // Recherche flexible pour les badges avec durées - // Badges Nitro avec durées (les noms peuvent varier dans Discord.js) - if (flagLower.includes('nitro')) { - // Essayer de détecter la durée exacte - if (flagLower.match(/6.*year|year.*6|emerald/)) { - badgeEmojis.push(BADGE_EMOJIS.nitro_6_years); - } else if (flagLower.match(/5.*year|year.*5/)) { - badgeEmojis.push(BADGE_EMOJIS.nitro_5_years); - } else if (flagLower.match(/3.*year|year.*3/)) { - badgeEmojis.push(BADGE_EMOJIS.nitro_3_years); - } else if (flagLower.match(/2.*year|year.*2/)) { - badgeEmojis.push(BADGE_EMOJIS.nitro_2_years); - } else if (flagLower.match(/1.*year|year.*1/) && !flagLower.includes('month')) { - badgeEmojis.push(BADGE_EMOJIS.nitro_1_year); - } else if (flagLower.match(/6.*month|month.*6/)) { - badgeEmojis.push(BADGE_EMOJIS.nitro_6_months); - } else if (flagLower.match(/3.*month|month.*3/)) { - badgeEmojis.push(BADGE_EMOJIS.nitro_3_months); - } else if (flagLower.match(/1.*month|month.*1/)) { - badgeEmojis.push(BADGE_EMOJIS.nitro_1_month); - } else { - // Badge Nitro de base (sans durée spécifique) - badgeEmojis.push(BADGE_EMOJIS.nitro); - } - } - // Badges Boost avec durées (les badges Boost personnels, pas le boost serveur) - // Les badges Boost sont basés sur la durée totale de boost sur TOUS les serveurs - else if (flagLower.includes('boost') && !flagLower.includes('server')) { - // Détecter la durée exacte en vérifiant les nombres dans le flag - // Les flags peuvent être: PremiumGuildSubscription, PremiumGuildSubscriptionTier1, etc. - // ou des flags spécifiques comme "PremiumGuildSubscription24Months" - - // Vérifier d'abord les durées les plus longues (pour éviter les fausses détections) - if (flagLower.match(/24|two.*four|twenty.*four/i)) { - badgeEmojis.push(BADGE_EMOJIS.boost_24_months); - } else if (flagLower.match(/18|eighteen/i)) { - badgeEmojis.push(BADGE_EMOJIS.boost_18_months); - } else if (flagLower.match(/15|fifteen/i)) { - badgeEmojis.push(BADGE_EMOJIS.boost_15_months); - } else if (flagLower.match(/12|twelve|one.*year|1.*year/) && - !flagLower.match(/18|15|24|128|112/i)) { - badgeEmojis.push(BADGE_EMOJIS.boost_12_months); - } else if (flagLower.match(/9|nine/) && !flagLower.match(/19|29|90|99/i)) { - badgeEmojis.push(BADGE_EMOJIS.boost_9_months); - } else if (flagLower.match(/6|six/) && - !flagLower.match(/16|26|60|66|68|69/i)) { - badgeEmojis.push(BADGE_EMOJIS.boost_6_months); - } else if (flagLower.match(/3|three/) && - !flagLower.match(/13|23|30|33|34|35|36|37|38|39/i)) { - badgeEmojis.push(BADGE_EMOJIS.boost_3_months); - } else if (flagLower.match(/2|two/) && - !flagLower.match(/12|20|21|22|23|24|25|26|27|28|29/i)) { - badgeEmojis.push(BADGE_EMOJIS.boost_2_months); - } else { - // Badge Boost de base (sans durée spécifique) - badgeEmojis.push(BADGE_EMOJIS.boost); - } - } - // Autres badges - else if (flagLower.includes('orb')) { - badgeEmojis.push(BADGE_EMOJIS.orbs); - } - else if (flagLower.includes('quest')) { - badgeEmojis.push(BADGE_EMOJIS.quests); - } - else if (flagLower.includes('slash')) { - badgeEmojis.push(BADGE_EMOJIS.slash_commands); - } - // Log pour debugger les flags non mappés (pour les ajouter plus tard) - else if (!flagToBadgeMap[flag]) { - console.log(`[PROFIL] Flag non mappé détecté: "${flag}" (pour l'utilisateur ${user.id})`); - } - } - } catch (err) { - // Si toArray() échoue, ignorer silencieusement - console.warn('Erreur lors de la récupération des flags:', err.message); - } - } - - // Badge Nitro de base (si l'utilisateur a Nitro mais pas les badges spéciaux dans les flags) - // Vérifier si un badge Nitro n'a pas déjà été ajouté via les flags - const hasNitroBadge = badgeEmojis.some(e => - typeof e === 'string' && ( - e.includes('nitro') || - e === BADGE_EMOJIS.nitro || - e === BADGE_EMOJIS.nitro_1_month || - e === BADGE_EMOJIS.nitro_3_months || - e === BADGE_EMOJIS.nitro_6_months || - e === BADGE_EMOJIS.nitro_1_year || - e === BADGE_EMOJIS.nitro_2_years || - e === BADGE_EMOJIS.nitro_3_years || - e === BADGE_EMOJIS.nitro_5_years || - e === BADGE_EMOJIS.nitro_6_years - ) - ); - - // IMPORTANT: Les badges Nitro avec durée (Émeraude 3 ans, Boost 18 mois, etc.) ne sont PAS - // accessibles via l'API Discord.js dans les flags utilisateur standard. - // Ces badges sont visibles côté client Discord mais ne sont pas exposés via l'API du bot. - // - // LIMITATION DE L'API DISCORD.JS : - // - premiumType : Méthode la plus fiable, mais souvent undefined même pour les utilisateurs Nitro - // - banner : Nécessite généralement Nitro, mais peut être présent sans Nitro dans certains cas - // - accentColor : Nécessite généralement Nitro, mais peut être présent sans Nitro dans certains cas - // - avatar animé : Nécessite généralement Nitro, mais peut être présent sans Nitro dans certains cas - // - // SOLUTION : Détection multi-niveaux pour équilibrer précision et détection - // Niveau 1 (preuve définitive) : premiumType défini ET != 0 → Nitro confirmé - // - premiumType 1 = NitroClassic - // - premiumType 2 = Nitro - // - premiumType 3 = NitroBasic - // - premiumType 0 = None (pas de Nitro) - // Niveau 2 (très probable) : banner présent → très probablement Nitro - // Niveau 3 (probable) : avatar animé ET accentColor → probablement Nitro (mais moins fiable) - // - // NOTE IMPORTANTE : accentColor seul n'est PAS utilisé car il peut être présent sans Nitro - // Mais accentColor + avatar animé ensemble = probablement Nitro (moins fiable que banner) - // - // Référence: https://discord-api-types.dev/api/discord-api-types-v10/enum/UserPremiumType - - // Vérifier les indicateurs - // premiumType peut être 0 (None), 1 (NitroClassic), 2 (Nitro), ou 3 (NitroBasic) - // On vérifie que premiumType est défini ET différent de 0 - const hasPremiumType = user.premiumType !== null && - user.premiumType !== undefined && - user.premiumType !== 0; - const hasBanner = user.banner !== null && user.banner !== undefined; - const hasAccentColor = user.accentColor !== null && user.accentColor !== undefined; - const hasAnimatedAvatar = user.avatar && user.avatar.startsWith('a_'); - - // Détecter Nitro avec priorité (du plus fiable au moins fiable) : - // 1. premiumType défini ET != 0 (preuve définitive) - score 100% - // 2. banner présent (très fiable ~99%) - score 99% - // 3. avatar animé ET accentColor (probable ~80%) - score 80% (moins fiable mais acceptable) - const hasNitro = hasPremiumType || - hasBanner || - (hasAnimatedAvatar && hasAccentColor); - - // Ajouter le badge Nitro de base si on détecte Nitro et qu'il n'y a pas déjà un badge Nitro spécifique - if (!hasNitroBadge && hasNitro) { - badgeEmojis.push(BADGE_EMOJIS.nitro); - } - - // Badge Booster (si le membre boost le serveur) - // Note: Les badges Boost avec durée sont basés sur la durée TOTALE de boost sur TOUS les serveurs - // et sont détectés via les flags utilisateur. Si aucun badge Boost n'est détecté dans les flags - // mais que l'utilisateur boost le serveur actuel, on peut calculer la durée depuis premiumSince - // pour afficher le badge approprié (mais ce n'est que pour le serveur actuel, pas la durée totale) - if (member && member.premiumSince) { - const hasBoostBadge = badgeEmojis.some(e => - typeof e === 'string' && ( - e.includes('boost') || - e === BADGE_EMOJIS.boost || - e === BADGE_EMOJIS.boost_2_months || - e === BADGE_EMOJIS.boost_3_months || - e === BADGE_EMOJIS.boost_6_months || - e === BADGE_EMOJIS.boost_9_months || - e === BADGE_EMOJIS.boost_12_months || - e === BADGE_EMOJIS.boost_15_months || - e === BADGE_EMOJIS.boost_18_months || - e === BADGE_EMOJIS.boost_24_months - ) - ); - - if (!hasBoostBadge) { - // Si le membre boost le serveur mais n'a pas de badge Boost dans les flags, - // on calcule la durée depuis premiumSince pour afficher le badge approprié - // NOTE: Ce n'est que pour le serveur actuel, pas la durée totale sur tous les serveurs - const boostDurationMs = Date.now() - member.premiumSince.getTime(); - const boostDurationMonths = Math.floor(boostDurationMs / (1000 * 60 * 60 * 24 * 30)); - - // Déterminer le badge Boost en fonction de la durée (sur ce serveur) - let boostBadge = BADGE_EMOJIS.boost; // Badge de base par défaut - - if (boostDurationMonths >= 24) { - boostBadge = BADGE_EMOJIS.boost_24_months; - } else if (boostDurationMonths >= 18) { - boostBadge = BADGE_EMOJIS.boost_18_months; - } else if (boostDurationMonths >= 15) { - boostBadge = BADGE_EMOJIS.boost_15_months; - } else if (boostDurationMonths >= 12) { - boostBadge = BADGE_EMOJIS.boost_12_months; - } else if (boostDurationMonths >= 9) { - boostBadge = BADGE_EMOJIS.boost_9_months; - } else if (boostDurationMonths >= 6) { - boostBadge = BADGE_EMOJIS.boost_6_months; - } else if (boostDurationMonths >= 3) { - boostBadge = BADGE_EMOJIS.boost_3_months; - } else if (boostDurationMonths >= 2) { - boostBadge = BADGE_EMOJIS.boost_2_months; - } - - badgeEmojis.push(boostBadge); - } - } - - // Dédupliquer les emojis avant de retourner - return [...new Set(badgeEmojis)]; + const badgeEmojis = []; + + if (user.flags) { + try { + const flagsArray = user.flags.toArray(); + const flagToBadgeMap = { + 'Staff': 'staff', 'Partner': 'partner', 'HypeSquad': 'hypesquad', + 'HypeSquadOnlineHouse1': 'hypesquad_bravery', 'HypeSquadOnlineHouse2': 'hypesquad_brilliance', 'HypeSquadOnlineHouse3': 'hypesquad_balance', + 'HypeSquadEvents': 'hypesquad_events', 'BugHunterLevel1': 'bug_hunter_level_1', 'BugHunterLevel2': 'bug_hunter_level_2', + 'PremiumEarlySupporter': 'early_supporter', 'VerifiedDeveloper': 'verified_developer', 'ActiveDeveloper': 'active_developer', + 'CertifiedModerator': 'certified_moderator', 'BotHTTPInteractions': 'bot_http_interactions', + 'Quests': 'quests', 'QuestsEarly': 'quests', 'SlashCommands': 'slash_commands', + }; + + for (const flag of flagsArray) { + const flagLower = flag.toLowerCase(); + const badgeKey = flagToBadgeMap[flag]; + + if (badgeKey && BADGE_EMOJIS[badgeKey]) { + badgeEmojis.push(BADGE_EMOJIS[badgeKey]); + continue; + } + + if (flagLower.includes('nitro')) { + if (flagLower.match(/6.*year|year.*6|emerald/)) badgeEmojis.push(BADGE_EMOJIS.nitro_6_years); + else if (flagLower.match(/5.*year|year.*5/)) badgeEmojis.push(BADGE_EMOJIS.nitro_5_years); + else if (flagLower.match(/3.*year|year.*3/)) badgeEmojis.push(BADGE_EMOJIS.nitro_3_years); + else if (flagLower.match(/2.*year|year.*2/)) badgeEmojis.push(BADGE_EMOJIS.nitro_2_years); + else if (flagLower.match(/1.*year|year.*1/) && !flagLower.includes('month')) badgeEmojis.push(BADGE_EMOJIS.nitro_1_year); + else if (flagLower.match(/6.*month|month.*6/)) badgeEmojis.push(BADGE_EMOJIS.nitro_6_months); + else if (flagLower.match(/3.*month|month.*3/)) badgeEmojis.push(BADGE_EMOJIS.nitro_3_months); + else if (flagLower.match(/1.*month|month.*1/)) badgeEmojis.push(BADGE_EMOJIS.nitro_1_month); + else badgeEmojis.push(BADGE_EMOJIS.nitro); + } + else if (flagLower.includes('boost') && !flagLower.includes('server')) { + if (flagLower.match(/24|two.*four|twenty.*four/i)) badgeEmojis.push(BADGE_EMOJIS.boost_24_months); + else if (flagLower.match(/18|eighteen/i)) badgeEmojis.push(BADGE_EMOJIS.boost_18_months); + else if (flagLower.match(/15|fifteen/i)) badgeEmojis.push(BADGE_EMOJIS.boost_15_months); + else if (flagLower.match(/12|twelve|one.*year|1.*year/) && !flagLower.match(/18|15|24|128|112/i)) badgeEmojis.push(BADGE_EMOJIS.boost_12_months); + else if (flagLower.match(/9|nine/) && !flagLower.match(/19|29|90|99/i)) badgeEmojis.push(BADGE_EMOJIS.boost_9_months); + else if (flagLower.match(/6|six/) && !flagLower.match(/16|26|60|66|68|69/i)) badgeEmojis.push(BADGE_EMOJIS.boost_6_months); + else if (flagLower.match(/3|three/) && !flagLower.match(/13|23|30|33|34|35|36|37|38|39/i)) badgeEmojis.push(BADGE_EMOJIS.boost_3_months); + else if (flagLower.match(/2|two/) && !flagLower.match(/12|20|21|22|23|24|25|26|27|28|29/i)) badgeEmojis.push(BADGE_EMOJIS.boost_2_months); + else badgeEmojis.push(BADGE_EMOJIS.boost); + } + else if (flagLower.includes('orb')) badgeEmojis.push(BADGE_EMOJIS.orbs); + else if (flagLower.includes('quest')) badgeEmojis.push(BADGE_EMOJIS.quests); + else if (flagLower.includes('slash')) badgeEmojis.push(BADGE_EMOJIS.slash_commands); + } + } catch (err) { console.warn('Erreur flags:', err.message); } + } + + const hasNitroBadge = badgeEmojis.some(e => typeof e === 'string' && e.includes('nitro')); + const hasPremiumType = user.premiumType && user.premiumType !== 0; + const hasBanner = user.banner; + const hasAccentColor = user.accentColor; + const hasAnimatedAvatar = user.avatar && user.avatar.startsWith('a_'); + const hasNitro = hasPremiumType || hasBanner || (hasAnimatedAvatar && hasAccentColor); + + if (!hasNitroBadge && hasNitro) badgeEmojis.push(BADGE_EMOJIS.nitro); + + if (member && member.premiumSince) { + const hasBoostBadge = badgeEmojis.some(e => typeof e === 'string' && e.includes('boost')); + if (!hasBoostBadge) { + const boostDurationMs = Date.now() - member.premiumSince.getTime(); + const boostDurationMonths = Math.floor(boostDurationMs / (1000 * 60 * 60 * 24 * 30)); + + let boostBadge = BADGE_EMOJIS.boost; + if (boostDurationMonths >= 24) boostBadge = BADGE_EMOJIS.boost_24_months; + else if (boostDurationMonths >= 18) boostBadge = BADGE_EMOJIS.boost_18_months; + else if (boostDurationMonths >= 15) boostBadge = BADGE_EMOJIS.boost_15_months; + else if (boostDurationMonths >= 12) boostBadge = BADGE_EMOJIS.boost_12_months; + else if (boostDurationMonths >= 9) boostBadge = BADGE_EMOJIS.boost_9_months; + else if (boostDurationMonths >= 6) boostBadge = BADGE_EMOJIS.boost_6_months; + else if (boostDurationMonths >= 3) boostBadge = BADGE_EMOJIS.boost_3_months; + else if (boostDurationMonths >= 2) boostBadge = BADGE_EMOJIS.boost_2_months; + + badgeEmojis.push(boostBadge); + } + } + + return [...new Set(badgeEmojis)]; } -// Fonction pour obtenir le statut Discord en français function getStatusFrench(presence) { - if (!presence || !presence.status) return { text: 'Hors ligne', emoji: '⚫' }; - - switch (presence.status) { - case 'online': - return { text: 'En ligne', emoji: '🟢' }; - case 'idle': - return { text: 'Absent', emoji: '🟡' }; - case 'dnd': - return { text: 'Ne pas déranger', emoji: '🔴' }; - case 'invisible': - case 'offline': - default: - return { text: 'Hors ligne', emoji: '⚫' }; - } + if (!presence || !presence.status) return { text: 'Hors ligne', emoji: '⚫' }; + switch (presence.status) { + case 'online': return { text: 'En ligne', emoji: '🟢' }; + case 'idle': return { text: 'Absent', emoji: '🟡' }; + case 'dnd': return { text: 'Ne pas déranger', emoji: '🔴' }; + default: return { text: 'Hors ligne', emoji: '⚫' }; + } } module.exports = { - category: 'info', - data: new SlashCommandBuilder() - .setName('profil') - .setDescription('Afficher le profil d\'un utilisateur') - .addSubcommand(subcommand => - subcommand - .setName('view') - .setDescription('Voir le profil d\'un utilisateur') - .addUserOption(option => - option.setName('user') - .setDescription('L\'utilisateur dont tu veux voir le profil') - .setRequired(false))) - .addSubcommand(subcommand => - subcommand - .setName('set') - .setDescription('Modifier ton profil') - .addStringOption(option => - option.setName('signature') - .setDescription('Ta signature personnalisée (max 200 caractères)') - .setRequired(false) - .setMaxLength(200))) - .addSubcommand(subcommand => - subcommand - .setName('reset') - .setDescription('Réinitialiser ta signature')), - async execute(interaction) { - const subcommand = interaction.options.getSubcommand(); - - if (subcommand === 'view') { - await interaction.deferReply(); - - const target = interaction.options.getUser('user') || interaction.user; - // Fetch l'utilisateur avec toutes les données pour avoir accès à premiumType, banner, accentColor, etc. - // Utiliser { force: true } pour forcer le fetch même si l'utilisateur est dans le cache - const fetchedUser = await interaction.client.users.fetch(target.id, { - force: true, - cache: false // Ne pas mettre en cache pour avoir les données les plus récentes - }).catch(() => { - // Si le fetch échoue, utiliser l'utilisateur du cache - console.warn(`[PROFIL] Impossible de fetcher l'utilisateur ${target.id}, utilisation du cache`); - return target; - }); - const member = await interaction.guild.members.fetch(target.id).catch(() => null); - - if (!member) { - return interaction.editReply({ - content: '❌ Cet utilisateur n\'est pas sur ce serveur.' - }); - } - - try { - // Récupérer les données XP - const userXP = await getUserXP(target.id, interaction.guild.id); - - // Récupérer le profil utilisateur - const [profiles] = await db.query( - 'SELECT * FROM user_profiles WHERE userId = ? AND guildId = ?', - [target.id, interaction.guild.id] - ); - const profile = profiles[0] || null; - - // Obtenir les badges (emojis seulement) - // Utiliser fetchedUser pour avoir accès à premiumType - const badgeEmojis = getDiscordBadges(fetchedUser, member); - const badgesText = badgeEmojis.length > 0 - ? badgeEmojis.join(' ') - : 'Aucun badge'; - - // Obtenir le statut (préserver la présence) - const presence = member.presence; - const status = getStatusFrench(presence); - - // Calculer l'âge du compte avec date - const accountAge = Math.floor((Date.now() - target.createdTimestamp) / (1000 * 60 * 60 * 24)); - const accountAgeYears = Math.floor(accountAge / 365); - const accountAgeMonths = Math.floor((accountAge % 365) / 30); - const accountAgeDays = accountAge % 30; - - let accountAgeText = ''; - if (accountAgeYears > 0) { - accountAgeText = `${accountAgeYears} an${accountAgeYears > 1 ? 's' : ''}`; - if (accountAgeMonths > 0) { - accountAgeText += ` ${accountAgeMonths} mois`; - } - } else if (accountAgeMonths > 0) { - accountAgeText = `${accountAgeMonths} mois`; - if (accountAgeDays > 0) { - accountAgeText += ` ${accountAgeDays} jour${accountAgeDays > 1 ? 's' : ''}`; - } - } else { - accountAgeText = `${accountAgeDays} jour${accountAgeDays > 1 ? 's' : ''}`; - } - - // Date de création formatée - const creationDate = ``; - const accountAgeWithDate = `${accountAgeText} (${creationDate})`; - - // Calculer le temps vocal (en minutes) - const voiceTimeMinutes = userXP?.totalVoiceTime || 0; - const voiceTimeHours = Math.floor(voiceTimeMinutes / 60); - const voiceTimeMins = voiceTimeMinutes % 60; - const voiceTimeText = voiceTimeHours > 0 - ? `${voiceTimeHours}h ${voiceTimeMins}min` - : `${voiceTimeMins}min`; - - // Calculer le rang (nécessite un await séparé) - const { getUserRank } = require('../../functions/xp/xp.js'); - const rank = userXP ? await getUserRank(target.id, interaction.guild.id) : 0; - - // Statistiques supplémentaires - // Nombre de bumps - const [bumps] = await db.query( - 'SELECT COUNT(*) as count FROM bumps WHERE userId = ? AND guildId = ?', - [target.id, interaction.guild.id] - ); - const bumpsCount = bumps[0]?.count || 0; - - // Nombre de bienvenues (depuis les logs XP) - const [welcomeLogs] = await db.query( - 'SELECT COUNT(*) as count FROM xp_logs WHERE userId = ? AND guildId = ? AND source = ?', - [target.id, interaction.guild.id, 'welcome'] - ); - const welcomeCount = welcomeLogs[0]?.count || 0; - - // Messages totaux (tous les serveurs où le bot est présent) - // On récupère la somme de tous les messages de l'utilisateur sur tous les serveurs - const [totalMessages] = await db.query( - 'SELECT SUM(totalMessages) as total FROM user_xp WHERE userId = ?', - [target.id] - ); - const totalMessagesCount = totalMessages[0]?.total || userXP?.totalMessages || 0; - - // Créer l'embed - const embed = new EmbedBuilder() - .setTitle(`📋 Profil de ${target.username}`) - .setColor(colors.primary) - .setThumbnail(target.displayAvatarURL({ dynamic: true, size: 256 })) - .setDescription(profile?.signature || '*Aucune signature*') - .addFields( - { name: '🆔 Identifiant', value: `${target.tag} (${target.id})`, inline: false }, - { name: '🏆 Badges', value: badgesText, inline: false }, - { name: `${status.emoji} Statut`, value: status.text, inline: true }, - { name: '📅 Âge du compte', value: accountAgeWithDate, inline: true }, - { name: '⭐ Niveau', value: `${userXP?.level || 0}`, inline: true }, - { name: '📊 XP Total', value: `${userXP?.xp || 0} XP`, inline: true }, - { name: '💬 Messages', value: `${totalMessagesCount}`, inline: true }, - { name: '🎤 Temps Vocal', value: voiceTimeText, inline: true }, - { name: '📈 Rang', value: `#${rank}`, inline: true }, - { name: '🚀 Bumps', value: `${bumpsCount}`, inline: true }, - { name: '👋 Bienvenues', value: `${welcomeCount}`, inline: true } - ) - .setFooter({ text: interaction.guild.name, iconURL: interaction.guild.iconURL({ dynamic: true }) }) - .setTimestamp(); - - // Ajouter l'âge si disponible (système d'anniversaire) - if (profile?.birthday) { - const birthday = new Date(profile.birthday); - const today = new Date(); - let age = today.getFullYear() - birthday.getFullYear(); - const monthDiff = today.getMonth() - birthday.getMonth(); - if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthday.getDate())) { - age--; - } - embed.addFields({ name: '🎂 Âge', value: `${age} ans`, inline: true }); - } - - await interaction.editReply({ embeds: [embed] }); - - } catch (err) { - console.error('Erreur lors de l\'affichage du profil:', err); - await interaction.editReply({ - content: '❌ Erreur lors de l\'affichage du profil.' - }); - } - - } else if (subcommand === 'set') { - await interaction.deferReply({ ephemeral: true }); - - const signature = interaction.options.getString('signature'); - - if (!signature) { - return interaction.editReply({ - content: '❌ Tu dois fournir une signature.' - }); - } - - try { - // Vérifier ou créer le profil - const [profiles] = await db.query( - 'SELECT * FROM user_profiles WHERE userId = ? AND guildId = ?', - [interaction.user.id, interaction.guild.id] - ); - - if (profiles.length > 0) { - // Mettre à jour la signature - await db.query( - 'UPDATE user_profiles SET signature = ?, updatedAt = ? WHERE userId = ? AND guildId = ?', - [signature, Date.now(), interaction.user.id, interaction.guild.id] - ); - } else { - // Créer le profil - await db.query( - 'INSERT INTO user_profiles (userId, guildId, signature, updatedAt) VALUES (?, ?, ?, ?)', - [interaction.user.id, interaction.guild.id, signature, Date.now()] - ); - } - - const embed = new EmbedBuilder() - .setTitle('✅ Signature Modifiée') - .setColor(colors.success) - .setDescription(`Ta signature a été mise à jour :\n\n${signature}`) - .setTimestamp(); - - await interaction.editReply({ embeds: [embed] }); - - } catch (err) { - console.error('Erreur lors de la modification de la signature:', err); - await interaction.editReply({ - content: '❌ Erreur lors de la modification de la signature.' - }); - } - - } else if (subcommand === 'reset') { - await interaction.deferReply({ ephemeral: true }); - - try { - // Vérifier si le profil existe - const [profiles] = await db.query( - 'SELECT * FROM user_profiles WHERE userId = ? AND guildId = ?', - [interaction.user.id, interaction.guild.id] - ); - - if (profiles.length === 0) { - return interaction.editReply({ - content: '❌ Tu n\'as pas de signature à réinitialiser.' - }); - } - - // Réinitialiser la signature - await db.query( - 'UPDATE user_profiles SET signature = NULL, updatedAt = ? WHERE userId = ? AND guildId = ?', - [Date.now(), interaction.user.id, interaction.guild.id] - ); - - const embed = new EmbedBuilder() - .setTitle('✅ Signature Réinitialisée') - .setColor(colors.success) - .setDescription('Ta signature a été réinitialisée.') - .setTimestamp(); - - await interaction.editReply({ embeds: [embed] }); - - } catch (err) { - console.error('Erreur lors de la réinitialisation de la signature:', err); - await interaction.editReply({ - content: '❌ Erreur lors de la réinitialisation de la signature.' - }); - } - } - }, -}; + category: 'info', + data: new SlashCommandBuilder() + .setName('profil') + .setDescription('Afficher le profil d\'un utilisateur') + .addSubcommand(subcommand => + subcommand.setName('view').setDescription('Voir le profil d\'un utilisateur') + .addUserOption(option => option.setName('user').setDescription('L\'utilisateur dont tu veux voir le profil').setRequired(false))) + .addSubcommand(subcommand => + subcommand.setName('set').setDescription('Modifier ton profil') + .addStringOption(option => option.setName('signature').setDescription('Ta signature personnalisée (max 200 caractères)').setRequired(false).setMaxLength(200)) + .addStringOption(option => option.setName('birthday').setDescription('Ta date d\'anniversaire (JJ/MM/AAAA)').setRequired(false)) + .addStringOption(option => option.setName('color').setDescription('Couleur de ton profil (Hex: #RRGGBB)').setRequired(false)) + .addStringOption(option => option.setName('gender').setDescription('Ton genre/pronoms').setRequired(false).setMaxLength(50)) + .addStringOption(option => option.setName('location').setDescription('Ta localisation').setRequired(false).setMaxLength(100))) + .addSubcommand(subcommand => + subcommand.setName('reset').setDescription('Réinitialiser ton profil')), + async execute(interaction) { + const subcommand = interaction.options.getSubcommand(); + + if (subcommand === 'view') { + await interaction.deferReply(); + + const target = interaction.options.getUser('user') || interaction.user; + const fetchedUser = await interaction.client.users.fetch(target.id, { force: true, cache: false }).catch(() => target); + const member = await interaction.guild.members.fetch(target.id).catch(() => null); + + if (!member) return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas sur ce serveur.' }); + + try { + const userXP = await getUserXP(target.id, interaction.guild.id); + const [profiles] = await db.query('SELECT * FROM user_profiles WHERE userId = ? AND guildId = ?', [target.id, interaction.guild.id]); + const profile = profiles[0] || null; + + const badgeEmojis = getDiscordBadges(fetchedUser, member); + const badgesText = badgeEmojis.length > 0 ? badgeEmojis.join(' ') : 'Aucun badge'; + const status = getStatusFrench(member.presence); + + const accountAge = Math.floor((Date.now() - target.createdTimestamp) / (1000 * 60 * 60 * 24)); + const accountAgeYears = Math.floor(accountAge / 365); + const accountAgeMonths = Math.floor((accountAge % 365) / 30); + const accountAgeDays = accountAge % 30; + + let accountAgeText = accountAgeYears > 0 ? `${accountAgeYears} an${accountAgeYears > 1 ? 's' : ''}` : ''; + if (accountAgeMonths > 0) accountAgeText += (accountAgeText ? ' ' : '') + `${accountAgeMonths} mois`; + if (!accountAgeText) accountAgeText = `${accountAgeDays} jour${accountAgeDays > 1 ? 's' : ''}`; + + const creationDate = ``; + const voiceTimeMinutes = userXP?.totalVoiceTime || 0; + const voiceTimeText = `${Math.floor(voiceTimeMinutes / 60)}h ${voiceTimeMinutes % 60}min`; + + const rank = userXP ? await getUserRank(target.id, interaction.guild.id) : 0; + + const [bumps] = await db.query('SELECT COUNT(*) as count FROM bumps WHERE userId = ? AND guildId = ?', [target.id, interaction.guild.id]); + const [welcomeLogs] = await db.query('SELECT COUNT(*) as count FROM xp_logs WHERE userId = ? AND guildId = ? AND source = ?', [target.id, interaction.guild.id, 'welcome']); + const [totalMessages] = await db.query('SELECT SUM(totalMessages) as total FROM user_xp WHERE userId = ?', [target.id]); + + const embedColor = profile?.color && /^#[0-9A-F]{6}$/i.test(profile.color) ? profile.color : colors.primary; + const embed = new EmbedBuilder() + .setAuthor({ name: `Profil de ${target.username}`, iconURL: target.displayAvatarURL({ dynamic: true }) }) + .setColor(embedColor) + .setThumbnail(target.displayAvatarURL({ dynamic: true, size: 256 })) + .setDescription(profile?.signature ? `\`\`\`${profile.signature}\`\`\`` : '*Aucune signature définie.*') + .addFields( + { name: '👤 Informations', value: `• **Identifiant:** \`${target.id}\`\n• **Badges:** ${badgesText}\n• **Âge Compte:** \`${accountAgeText}\`\n• **Statut:** ${status.emoji} \`${status.text}\``, inline: false }, + { name: '📊 Statistiques XP', value: `• **Niveau:** \`${userXP?.level || 0}\`\n• **XP Total:** \`${userXP?.xp || 0}\`\n• **Rang:** \`#${rank}\``, inline: true }, + { name: '🎙️ Activité Vocal', value: `• **Temps:** \`${voiceTimeText}\`\n• **Bumps:** \`${bumps[0]?.count || 0}\`\n• **Messages:** \`${totalMessages[0]?.total || userXP?.totalMessages || 0}\``, inline: true }, + { name: '🤝 Engagement', value: `• **Bienvenues:** \`${welcomeLogs[0]?.count || 0}\`\n• **Création:** ${creationDate}`, inline: false } + ) + .setFooter({ text: `Demandé par ${interaction.user.tag}`, iconURL: interaction.user.displayAvatarURL() }) + .setTimestamp(); + + const personalInfos = []; + if (profile?.gender) personalInfos.push(`• **Genre/Pronoms:** ${profile.gender}`); + if (profile?.location) personalInfos.push(`• **Localisation:** ${profile.location}`); + if (profile?.birthday) { + const birthday = new Date(profile.birthday); + const today = new Date(); + let age = today.getFullYear() - birthday.getFullYear(); + const monthDiff = today.getMonth() - birthday.getMonth(); + if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthday.getDate())) age--; + personalInfos.push(`• **Anniversaire:** ${birthday.toLocaleDateString('fr-FR')} (${age} ans)`); + } + + if (personalInfos.length > 0) { + embed.addFields({ name: '📝 Infos Personnelles', value: personalInfos.join('\n'), inline: false }); + } + + await interaction.editReply({ embeds: [embed] }); + + } catch (err) { + console.error('Erreur profil:', err); + await interaction.editReply({ content: '❌ Erreur lors de l\'affichage du profil.' }); + } + + } else if (subcommand === 'set') { + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); + + const signature = interaction.options.getString('signature'); + const birthdayInput = interaction.options.getString('birthday'); + const color = interaction.options.getString('color'); + const gender = interaction.options.getString('gender'); + const location = interaction.options.getString('location'); + + if (!signature && !birthdayInput && !color && !gender && !location) { + return interaction.editReply({ content: '❌ Tu dois modifier au moins un élément.' }); + } + + try { + let birthdayDate = null; + if (birthdayInput) { + const parts = birthdayInput.split('/'); + if (parts.length === 3) { + const day = parseInt(parts[0], 10); + const month = parseInt(parts[1], 10) - 1; + const year = parseInt(parts[2], 10); + + const currentYear = new Date().getFullYear(); + if (year < 1900 || year > currentYear) { + return interaction.editReply({ content: '❌ Année invalide. Doit être entre 1900 et aujourd\'hui.' }); + } + + const date = new Date(year, month, day); + if (date.getFullYear() === year && date.getMonth() === month && date.getDate() === day) { + // Vérifier si la date est dans le futur + if (date > new Date()) { + return interaction.editReply({ content: '❌ Tu ne peux pas être né dans le futur !' }); + } + birthdayDate = `${year}-${month + 1}-${day}`; + } else { + return interaction.editReply({ content: '❌ Date invalide. Format: JJ/MM/AAAA' }); + } + } else { + return interaction.editReply({ content: '❌ Format de date invalide. Utilise JJ/MM/AAAA' }); + } + } + + if (color && !/^#[0-9A-F]{6}$/i.test(color)) { + return interaction.editReply({ content: '❌ Couleur invalide. Utilise le format Hex (ex: #FF0000).' }); + } + + const [profiles] = await db.query('SELECT * FROM user_profiles WHERE userId = ? AND guildId = ?', [interaction.user.id, interaction.guild.id]); + + if (profiles.length > 0) { + const updates = []; + const params = []; + + if (signature) { updates.push('signature = ?'); params.push(signature); } + if (birthdayDate) { updates.push('birthday = ?'); params.push(birthdayDate); } + if (color) { updates.push('color = ?'); params.push(color); } + if (gender) { updates.push('gender = ?'); params.push(gender); } + if (location) { updates.push('location = ?'); params.push(location); } + + updates.push('updatedAt = ?'); + params.push(Date.now()); + params.push(interaction.user.id); + params.push(interaction.guild.id); + + await db.query(`UPDATE user_profiles SET ${updates.join(', ')} WHERE userId = ? AND guildId = ?`, params); + } else { + await db.query( + 'INSERT INTO user_profiles (userId, guildId, signature, birthday, color, gender, location, updatedAt) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', + [ + interaction.user.id, + interaction.guild.id, + signature || null, + birthdayDate || null, + color || null, + gender || null, + location || null, + Date.now() + ] + ); + } + + const embed = new EmbedBuilder().setTitle('✅ Profil Modifié').setColor(colors.success).setDescription('Ton profil a été mis à jour avec succès !').setTimestamp(); + await interaction.editReply({ embeds: [embed] }); + } catch (err) { + console.error('Erreur set profil:', err); + await interaction.editReply({ content: '❌ Erreur lors de la modification du profil.' }); + } + + } else if (subcommand === 'reset') { + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); + try { + await db.query('DELETE FROM user_profiles WHERE userId = ? AND guildId = ?', [interaction.user.id, interaction.guild.id]); + const embed = new EmbedBuilder().setTitle('✅ Profil Réinitialisé').setColor(colors.success).setDescription('Ton profil a été entièrement réinitialisé.').setTimestamp(); + await interaction.editReply({ embeds: [embed] }); + } catch (err) { + console.error('Erreur reset profil:', err); + await interaction.editReply({ content: '❌ Erreur lors de la réinitialisation du profil.' }); + } + } + }, +}; \ No newline at end of file diff --git a/commands/info/serverinfo.js b/commands/info/serverinfo.js index c1dd9f6..a850771 100644 --- a/commands/info/serverinfo.js +++ b/commands/info/serverinfo.js @@ -1,47 +1,53 @@ -const { SlashCommandBuilder, EmbedBuilder } = require('discord.js'); +const { SlashCommandBuilder, EmbedBuilder, GuildVerificationLevel } = require('discord.js'); +const { colors, emojis } = require('../../utils/constants'); -module.exports = { - category: 'info', - data: new SlashCommandBuilder() - .setName('serverinfo') - .setDescription('Affiche les informations du serveur.'), - async execute(interaction) { - const guild = interaction.guild; - const owner = await guild.fetchOwner(); - - const { colors, emojis } = require('../../utils/constants'); - - const embed = new EmbedBuilder() - .setAuthor({ - name: `${guild.name}`, - iconURL: guild.iconURL({ dynamic: true }) || undefined - }) - .setTitle(`${emojis.server} Informations du Serveur`) - .setColor(colors.info) - .setThumbnail(guild.iconURL({ dynamic: true, size: 256 }) || null) - .addFields( - { name: '👑 Propriétaire', value: `${owner.user.toString()}\n\`${owner.user.tag}\``, inline: true }, - { name: `${emojis.id} ID`, value: `\`${guild.id}\``, inline: true }, - { name: `${emojis.calendar} Créé le`, value: ``, inline: true }, - { name: '👥 Membres', value: `\`${guild.memberCount.toLocaleString()}\``, inline: true }, - { name: '💬 Canaux', value: `\`${guild.channels.cache.size}\``, inline: true }, - { name: '😀 Emojis', value: `\`${guild.emojis.cache.size}\``, inline: true }, - { name: '🎭 Rôles', value: `\`${guild.roles.cache.size}\``, inline: true }, - { name: '✅ Vérification', value: `\`${guild.verificationLevel}\``, inline: true }, - { name: '🔒 Sécurité', value: guild.mfaLevel === 1 ? '`Élevé (2FA)`' : '`Normal`', inline: true } - ) - .setFooter({ text: `${guild.name} • ${interaction.client.user.username}`, iconURL: interaction.client.user.displayAvatarURL() }) - .setTimestamp(); - - if (guild.description) { - embed.setDescription(guild.description); - } - - if (guild.banner) { - embed.setImage(guild.bannerURL({ dynamic: true, size: 1024 })); - } - - await interaction.reply({ embeds: [embed] }); - }, +const verificationLevels = { + [GuildVerificationLevel.None]: 'Aucune', + [GuildVerificationLevel.Low]: 'Faible', + [GuildVerificationLevel.Medium]: 'Moyenne', + [GuildVerificationLevel.High]: 'Élevée', + [GuildVerificationLevel.VeryHigh]: 'Très Élevée' }; +module.exports = { + category: 'info', + data: new SlashCommandBuilder() + .setName('serverinfo') + .setDescription('Affiche les informations du serveur.'), + async execute(interaction) { + const guild = interaction.guild; + const owner = await guild.fetchOwner(); + + const embed = new EmbedBuilder() + .setAuthor({ + name: guild.name, + iconURL: guild.iconURL({ dynamic: true }) || undefined + }) + .setTitle(`${emojis.server} Informations du Serveur`) + .setColor(colors.info) + .setThumbnail(guild.iconURL({ dynamic: true, size: 256 }) || null) + .addFields( + { name: '👑 Propriétaire', value: `${owner.user.toString()}\n\`${owner.user.tag}\``, inline: true }, + { name: `${emojis.id} ID`, value: `\`${guild.id}\``, inline: true }, + { name: `${emojis.calendar} Créé le`, value: ``, inline: true }, + { name: '👥 Membres', value: `\`${guild.memberCount.toLocaleString()}\``, inline: true }, + { name: '💬 Canaux', value: `\`${guild.channels.cache.size}\``, inline: true }, + { name: '😀 Emojis', value: `\`${guild.emojis.cache.size}\``, inline: true }, + { name: '🎭 Rôles', value: `\`${guild.roles.cache.size}\``, inline: true }, + { name: '✅ Vérification', value: `\`${verificationLevels[guild.verificationLevel] || 'Inconnue'}\``, inline: true }, + { name: '🔒 Sécurité', value: guild.mfaLevel === 1 ? '`Élevé (2FA)`' : '`Normal`', inline: true } + ) + .setFooter({ text: `${guild.name} • ${interaction.client.user.username}`, iconURL: interaction.client.user.displayAvatarURL() }) + .setTimestamp(); + + if (guild.description) { + embed.setDescription(guild.description); + } + + if (guild.banner) { + embed.setImage(guild.bannerURL({ dynamic: true, size: 1024 })); + } + + await interaction.reply({ embeds: [embed] }); + }, +}; \ No newline at end of file diff --git a/commands/info/userinfo.js b/commands/info/userinfo.js index 8fbabd7..46440fd 100644 --- a/commands/info/userinfo.js +++ b/commands/info/userinfo.js @@ -1,91 +1,70 @@ const { SlashCommandBuilder, EmbedBuilder } = require('discord.js'); +const { colors, emojis } = require('../../utils/constants'); + +function getStatusFrench(presence) { + if (!presence || !presence.status) return { text: 'Hors ligne', emoji: '⚫' }; + switch (presence.status) { + case 'online': return { text: 'En ligne', emoji: '🟢' }; + case 'idle': return { text: 'Absent', emoji: '🟡' }; + case 'dnd': return { text: 'Ne pas déranger', emoji: '🔴' }; + default: return { text: 'Hors ligne', emoji: '⚫' }; + } +} module.exports = { - category: 'info', - data: new SlashCommandBuilder() - .setName('userinfo') - .setDescription('Affiche les informations d\'un utilisateur.') - .addUserOption(option => - option.setName('user') - .setDescription('L\'utilisateur dont tu veux voir les informations') - .setRequired(false)), - async execute(interaction) { - const target = interaction.options.getUser('user') || interaction.user; - const member = await interaction.guild.members.fetch(target.id).catch(() => null); + category: 'info', + data: new SlashCommandBuilder() + .setName('userinfo') + .setDescription('Affiche les informations d\'un utilisateur.') + .addUserOption(option => + option.setName('user') + .setDescription('L\'utilisateur dont tu veux voir les informations') + .setRequired(false)), + async execute(interaction) { + const target = interaction.options.getUser('user') || interaction.user; + const member = await interaction.guild.members.fetch(target.id).catch(() => null); - const { colors, emojis } = require('../../utils/constants'); - - const embed = new EmbedBuilder() - .setAuthor({ - name: `${target.displayName}`, - iconURL: target.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.user} Informations Utilisateur`) - .setColor(colors.info) - .setThumbnail(target.displayAvatarURL({ dynamic: true, size: 256 })) - .addFields( - { name: `${emojis.id} ID`, value: `\`${target.id}\``, inline: true }, - { name: `${emojis.calendar} Compte créé`, value: ``, inline: true }, - { name: '🤖 Bot', value: target.bot ? '`Oui`' : '`Non`', inline: true } - ) - .setFooter({ text: `${interaction.guild.name} • ${interaction.client.user.username}`, iconURL: interaction.client.user.displayAvatarURL() }) - .setTimestamp(); + const embed = new EmbedBuilder() + .setAuthor({ + name: target.displayName, + iconURL: target.displayAvatarURL({ dynamic: true }) + }) + .setTitle(`${emojis.user} Informations Utilisateur`) + .setColor(colors.info) + .setThumbnail(target.displayAvatarURL({ dynamic: true, size: 256 })) + .addFields( + { name: `${emojis.id} ID`, value: `\`${target.id}\``, inline: true }, + { name: `${emojis.calendar} Compte créé`, value: ``, inline: true }, + { name: '🤖 Bot', value: target.bot ? '`Oui`' : '`Non`', inline: true } + ) + .setFooter({ text: `${interaction.guild.name} • ${interaction.client.user.username}`, iconURL: interaction.client.user.displayAvatarURL() }) + .setTimestamp(); - if (member) { - // Récupérer le statut avec gestion des différents cas - let status = 'Hors ligne'; - let statusEmoji = '⚫'; - - if (member.presence) { - const presenceStatus = member.presence.status; - switch (presenceStatus) { - case 'online': - status = 'En ligne'; - statusEmoji = '🟢'; - break; - case 'idle': - status = 'Inactif'; - statusEmoji = '🟡'; - break; - case 'dnd': - status = 'Ne pas déranger'; - statusEmoji = '🔴'; - break; - case 'invisible': - status = 'Invisible'; - statusEmoji = '⚫'; - break; - case 'offline': - status = 'Hors ligne'; - statusEmoji = '⚫'; - break; - default: - status = 'Inconnu'; - statusEmoji = '⚪'; - } - } + if (member) { + const status = getStatusFrench(member.presence); + const roles = member.roles.cache.filter(r => r.id !== interaction.guild.id); + const rolesDisplay = roles.size > 0 ? roles.sort((a, b) => b.position - a.position).map(r => r.toString()).slice(0, 10).join(', ') : '`Aucun`'; - embed.addFields( - { name: '📥 A rejoint le', value: ``, inline: true }, - { name: '⏰ Statut', value: `${statusEmoji} \`${status}\``, inline: true }, - { name: '👑 Rôle le plus élevé', value: member.roles.highest.toString(), inline: true }, - { name: '🎭 Rôles', value: member.roles.cache.size > 1 ? member.roles.cache.filter(r => r.id !== interaction.guild.id).map(r => r.toString()).slice(0, 10).join(', ') || '`Aucun`' : '`Aucun`', inline: false } - ); + embed.addFields( + { name: '📥 A rejoint le', value: ``, inline: true }, + { name: '⏰ Statut', value: `${status.emoji} \`${status.text}\``, inline: true }, + { name: '👑 Rôle le plus élevé', value: member.roles.highest.toString(), inline: true }, + { name: '🎭 Rôles', value: rolesDisplay, inline: false } + ); - if (member.nickname) { - embed.addFields({ name: '📝 Surnom', value: `\`${member.nickname}\``, inline: true }); - } + if (member.nickname) { + embed.addFields({ name: '📝 Surnom', value: `\`${member.nickname}\``, inline: true }); + } - if (member.roles.cache.size > 11) { - embed.addFields({ name: '📊 Total de rôles', value: `\`${member.roles.cache.size - 1}\``, inline: true }); - } - } + if (roles.size > 10) { + embed.addFields({ name: '📊 Total de rôles', value: `\`${roles.size}\``, inline: true }); + } + } - if (target.banner) { - embed.setImage(target.bannerURL({ dynamic: true, size: 1024 })); - } - - await interaction.reply({ embeds: [embed] }); - }, -}; + if (target.banner) { + embed.setImage(target.bannerURL({ dynamic: true, size: 1024 })); + } + await interaction.reply({ embeds: [embed] }); + }, +}; \ No newline at end of file diff --git a/commands/moderation/ban.js b/commands/moderation/ban.js index 49927fa..d2fcc34 100644 --- a/commands/moderation/ban.js +++ b/commands/moderation/ban.js @@ -1,134 +1,119 @@ -const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder } = require('discord.js'); +const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); +const { parseDuration, formatDuration, sendLog } = require('../../utils/helpers'); +const { colors, emojis } = require('../../utils/constants'); module.exports = { - category: 'moderation', - data: new SlashCommandBuilder() - .setName('ban') - .setDescription('Bannir un membre du serveur.') - .addUserOption(option => - option.setName('target') - .setDescription('Le membre à bannir') - .setRequired(true)) - .addStringOption(option => - option.setName('reason') - .setDescription('Raison du bannissement') - .setRequired(false)) - .addStringOption(option => - option.setName('duration') - .setDescription('Durée du ban (ex: 1h, 2d, laisser vide pour permanent)') - .setRequired(false)) - .setDefaultMemberPermissions(PermissionFlagsBits.BanMembers), + category: 'moderation', + data: new SlashCommandBuilder() + .setName('ban') + .setDescription('Bannir un membre du serveur.') + .addUserOption(option => + option.setName('target') + .setDescription('Le membre à bannir') + .setRequired(true)) + .addStringOption(option => + option.setName('reason') + .setDescription('Raison du bannissement') + .setRequired(false)) + .addStringOption(option => + option.setName('duration') + .setDescription('Durée du ban (ex: 1h, 2d, laisser vide pour permanent)') + .setRequired(false)) + .setDefaultMemberPermissions(PermissionFlagsBits.BanMembers), - async execute(interaction) { - const target = interaction.options.getUser('target'); - const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; - const durationInput = interaction.options.getString('duration'); + async execute(interaction) { + const target = interaction.options.getUser('target'); + const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; + const durationInput = interaction.options.getString('duration'); - await interaction.deferReply({ ephemeral: true }); + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); - if (!target) { - return interaction.editReply({ content: '❌ Aucun utilisateur spécifié !' }); - } + if (!target) return interaction.editReply({ content: '❌ Aucun utilisateur spécifié !' }); - // Vérifier que l'utilisateur peut être banni - const member = await interaction.guild.members.fetch(target.id).catch(() => null); - if (member) { - if (member.roles.highest.position >= interaction.member.roles.highest.position && interaction.guild.ownerId !== interaction.user.id) { - return interaction.editReply({ content: '❌ Tu ne peux pas bannir cet utilisateur car il a un rôle supérieur ou égal au tien.' }); - } - if (member.id === interaction.guild.ownerId) { - return interaction.editReply({ content: '❌ Tu ne peux pas bannir le propriétaire du serveur.' }); - } - } + const member = await interaction.guild.members.fetch(target.id).catch(() => null); + if (member) { + if (member.roles.highest.position >= interaction.member.roles.highest.position && interaction.guild.ownerId !== interaction.user.id) { + return interaction.editReply({ content: '❌ Tu ne peux pas bannir cet utilisateur car il a un rôle supérieur ou égal au tien.' }); + } + if (member.id === interaction.guild.ownerId) { + return interaction.editReply({ content: '❌ Tu ne peux pas bannir le propriétaire du serveur.' }); + } + if (!member.bannable) { + return interaction.editReply({ content: '❌ Je ne peux pas bannir cet utilisateur (rôle supérieur au mien ?).' }); + } + } - let type = 'Permanent'; - let unbanDate = null; - let durationText = 'Permanent'; + let type = 'Permanent'; + let unbanDate = null; + let durationText = 'Permanent'; - if (durationInput) { - const { parseDuration, formatDuration } = require('../../utils/helpers'); - const durationMs = parseDuration(durationInput); - if (durationMs) { - unbanDate = Date.now() + durationMs; - type = 'Temporary'; - durationText = formatDuration(durationMs); - } - } + if (durationInput) { + const durationMs = parseDuration(durationInput); + if (durationMs) { + unbanDate = Date.now() + durationMs; + type = 'Temporary'; + durationText = formatDuration(durationMs); + } else { + return interaction.editReply({ content: '❌ Format de durée invalide (ex: 1h, 2d).' }); + } + } - try { - // Bannissement - await interaction.guild.bans.create(target.id, { reason: `Banni par ${interaction.user.tag}: ${reason}` }); + try { + await interaction.guild.bans.create(target.id, { reason: `Banni par ${interaction.user.tag}: ${reason}` }); - // Stockage dans MySQL (bans) - await db.query( - `INSERT INTO bans (userId, reason, modId, timestamp, type, unbanDate, guildId) - VALUES (?, ?, ?, ?, ?, ?, ?) - ON DUPLICATE KEY UPDATE reason=VALUES(reason), modId=VALUES(modId), timestamp=VALUES(timestamp), type=VALUES(type), unbanDate=VALUES(unbanDate)`, - [target.id, reason, interaction.user.id, Date.now(), type, unbanDate, interaction.guild.id] - ); + await db.query( + `INSERT INTO bans (userId, reason, modId, timestamp, type, unbanDate, guildId) + VALUES (?, ?, ?, ?, ?, ?, ?) + ON DUPLICATE KEY UPDATE reason=VALUES(reason), modId=VALUES(modId), timestamp=VALUES(timestamp), type=VALUES(type), unbanDate=VALUES(unbanDate)`, + [target.id, reason, interaction.user.id, Date.now(), type, unbanDate, interaction.guild.id] + ); - await db.query( - `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, - [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Bannissement', reason, type, interaction.guild.id, Date.now()] - ); + await db.query( + `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Bannissement', reason, type, interaction.guild.id, Date.now()] + ); - const { colors, emojis } = require('../../utils/constants'); - const { sendLog } = require('../../utils/helpers'); + const embed = new EmbedBuilder() + .setAuthor({ name: target.displayName, iconURL: target.displayAvatarURL({ dynamic: true }) }) + .setTitle(`${emojis.ban} Utilisateur Banni`) + .setColor(colors.ban) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .setDescription(`${target.toString()} a été banni du serveur.`) + .addFields( + { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, + { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, + { name: '⏱️ Durée', value: `\`${durationText}\``, inline: true }, + { name: '📝 Raison', value: reason, inline: false }, + { name: '📅 Date', value: ``, inline: true }, + { name: '🏷️ Type', value: `\`${type}\``, inline: true } + ) + .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) + .setTimestamp(); - const embed = new EmbedBuilder() - .setAuthor({ - name: `${target.displayName}`, - iconURL: target.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.ban} Utilisateur Banni`) - .setColor(colors.ban) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .setDescription(`${target.toString()} a été banni du serveur.`) - .addFields( - { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, - { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, - { name: '⏱️ Durée', value: `\`${durationText}\``, inline: true }, - { name: '📝 Raison', value: reason, inline: false }, - { name: '📅 Date', value: ``, inline: true }, - { name: '🏷️ Type', value: `\`${type}\``, inline: true } - ) - .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) - .setTimestamp(); + await interaction.editReply({ embeds: [embed] }); - await interaction.editReply({ embeds: [embed] }); + const logEmbed = new EmbedBuilder() + .setAuthor({ name: interaction.user.displayName, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }) + .setTitle(`${emojis.ban} Bannissement`) + .setColor(colors.ban) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .setDescription(`${target.toString()} a été banni du serveur.`) + .addFields( + { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, + { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, + { name: '⏱️ Durée', value: `\`${durationText}\``, inline: true }, + { name: '📝 Raison', value: reason, inline: false } + ) + .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) + .setTimestamp(); + + await sendLog(interaction.guild, { embeds: [logEmbed] }); - // Log dans le canal de logs - const logEmbed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.user.displayName}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.ban} Bannissement`) - .setColor(colors.ban) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .setDescription(`${target.toString()} a été banni du serveur.`) - .addFields( - { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, - { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, - { name: '⏱️ Durée', value: `\`${durationText}\``, inline: true }, - { name: '📝 Raison', value: reason, inline: false }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) - .setTimestamp(); - await sendLog(interaction.guild, { embeds: [logEmbed] }); - - } catch (err) { - console.error('Erreur lors du bannissement:', err); - if (err.code === 50013) { - await interaction.editReply({ content: '❌ Je n\'ai pas les permissions nécessaires pour bannir cet utilisateur.', ephemeral: true }); - } else if (err.code === 50035) { - await interaction.editReply({ content: '❌ Cet utilisateur est déjà banni.', ephemeral: true }); - } else { - await interaction.editReply({ content: `❌ Échec du bannissement de ${target.tag}: ${err.message}`, ephemeral: true }); - } - } - }, -}; + } catch (err) { + console.error('Erreur ban:', err); + await interaction.editReply({ content: `❌ Erreur: ${err.message}` }); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/casier.js b/commands/moderation/casier.js index 7d5c16e..73e3c01 100644 --- a/commands/moderation/casier.js +++ b/commands/moderation/casier.js @@ -1,115 +1,106 @@ -const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); +const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); +const { colors } = require('../../utils/constants'); module.exports = { - category: 'moderation', - data: new SlashCommandBuilder() - .setName('casier') - .setDescription('Voir toutes les sanctions d\'un membre.') - .addUserOption(option => - option.setName('membre') - .setDescription('Le membre dont tu veux voir le casier') - .setRequired(true)), + category: 'moderation', + data: new SlashCommandBuilder() + .setName('casier') + .setDescription('Voir toutes les sanctions d\'un membre.') + .addUserOption(option => + option.setName('membre') + .setDescription('Le membre dont tu veux voir le casier') + .setRequired(true)), - async execute(interaction) { - await interaction.deferReply(); + async execute(interaction) { + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); - const member = interaction.options.getUser('membre'); + const member = interaction.options.getUser('membre'); - try { - const [rows] = await db.query( - 'SELECT * FROM logs WHERE userId = ? AND guildId = ? ORDER BY timestamp DESC', - [member.id, interaction.guild.id] - ); + try { + const [rows] = await db.query( + 'SELECT * FROM logs WHERE userId = ? AND guildId = ? ORDER BY timestamp DESC', + [member.id, interaction.guild.id] + ); - // Filtrer les modifications et révocations (ce ne sont pas des sanctions à afficher) - const sanctions = rows.filter(row => - row.action !== 'Modification de sanction' && - row.action !== 'Révocation de sanction' && - row.action !== 'Modification de mute' - ); + const sanctions = rows.filter(row => + row.action !== 'Modification de sanction' && + row.action !== 'Révocation de sanction' && + row.action !== 'Modification de mute' + ); - if (!sanctions.length) { - return interaction.editReply({ content: `✅ ${member.tag} n'a aucune sanction sur ce serveur.` }); - } + if (!sanctions.length) { + return interaction.editReply({ content: `✅ ${member.tag} n'a aucune sanction sur ce serveur.` }); + } - // Découpe les sanctions en pages de 10 - const pages = []; - for (let i = 0; i < sanctions.length; i += 10) { - pages.push(sanctions.slice(i, i + 10)); - } + const pages = []; + for (let i = 0; i < sanctions.length; i += 10) { + pages.push(sanctions.slice(i, i + 10)); + } - const { colors, emojis } = require('../../utils/constants'); - - const embeds = pages.map((page, pageIndex) => { - const embed = new EmbedBuilder() - .setAuthor({ - name: `${member.displayName}`, - iconURL: member.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`📋 Casier Judiciaire - Page ${pageIndex + 1}/${pages.length}`) - .setColor(colors.warning) - .setThumbnail(member.displayAvatarURL({ dynamic: true, size: 256 })) - .setDescription(`**${member.toString()}** • \`${member.tag}\``) - .setFooter({ text: `Total: ${sanctions.length} sanction(s) • ${interaction.guild.name}` }) - .setTimestamp(); + const embeds = pages.map((page, pageIndex) => { + const embed = new EmbedBuilder() + .setAuthor({ name: member.displayName, iconURL: member.displayAvatarURL({ dynamic: true }) }) + .setTitle(`📋 Casier Judiciaire - Page ${pageIndex + 1}/${pages.length}`) + .setColor(colors.warning) + .setThumbnail(member.displayAvatarURL({ dynamic: true, size: 256 })) + .setDescription(`**${member.toString()}** • \`${member.tag}\``) + .setFooter({ text: `Total: ${sanctions.length} sanction(s) • ${interaction.guild.name}` }) + .setTimestamp(); - page.forEach((row, index) => { - const date = ``; - const actionCapitalized = row.action.charAt(0).toUpperCase() + row.action.slice(1); - const guildName = row.guildId - ? interaction.client.guilds.cache.get(row.guildId)?.name || 'Serveur inconnu' - : 'Serveur inconnu'; - - // Numéro d'affichage (position dans la liste filtrée, à partir de 1) - const displayNumber = index + 1 + pageIndex * 10; + page.forEach((row, index) => { + const date = ``; + const actionCapitalized = row.action.charAt(0).toUpperCase() + row.action.slice(1); + const guildName = row.guildId + ? interaction.client.guilds.cache.get(row.guildId)?.name || 'Serveur inconnu' + : 'Serveur inconnu'; + + const displayNumber = index + 1 + pageIndex * 10; - embed.addFields({ - name: `#${displayNumber} (ID: \`${row.id}\`) - ${actionCapitalized}`, - value: `**Modérateur:** <@${row.modId}> (\`${row.modTag || 'N/A'}\`)\n` + - `**Raison:** ${row.reason || '`N/A`'}\n` + - `**Serveur:** \`${guildName}\`\n` + - `**Date:** ${date}\n` + - `**Type:** \`${row.type || 'N/A'}\``, - inline: false - }); - }); + embed.addFields({ + name: `#${displayNumber} (ID: \`${row.id}\`) - ${actionCapitalized}`, + value: `**Modérateur:** <@${row.modId}> (\`${row.modTag || 'N/A'}\`)\n` + + `**Raison:** ${row.reason || '`N/A`'}\n` + + `**Serveur:** \`${guildName}\`\n` + + `**Date:** ${date}\n` + + `**Type:** \`${row.type || 'N/A'}\``, + inline: false + }); + }); - return embed; - }); + return embed; + }); - // Composants pour naviguer - const row = new ActionRowBuilder().addComponents( - new ButtonBuilder().setCustomId('prev').setLabel('⬅️ Précédent').setStyle(ButtonStyle.Primary).setDisabled(pages.length === 1), - new ButtonBuilder().setCustomId('next').setLabel('Suivant ➡️').setStyle(ButtonStyle.Primary).setDisabled(pages.length === 1) - ); + const row = new ActionRowBuilder().addComponents( + new ButtonBuilder().setCustomId('prev').setLabel('⬅️ Précédent').setStyle(ButtonStyle.Primary).setDisabled(pages.length === 1), + new ButtonBuilder().setCustomId('next').setLabel('Suivant ➡️').setStyle(ButtonStyle.Primary).setDisabled(pages.length === 1) + ); - let currentPage = 0; - const message = await interaction.editReply({ embeds: [embeds[currentPage]], components: pages.length > 1 ? [row] : [] }); + let currentPage = 0; + const message = await interaction.editReply({ embeds: [embeds[currentPage]], components: pages.length > 1 ? [row] : [] }); - // Collecteur de boutons - const collector = message.createMessageComponentCollector({ time: 60_000 }); - collector.on('collect', async i => { - if (i.user.id !== interaction.user.id) { - return i.reply({ content: '❌ Ce n\'est pas ton menu !', ephemeral: true }); - } - if (i.customId === 'next') { - currentPage = (currentPage + 1) % embeds.length; - } - if (i.customId === 'prev') { - currentPage = (currentPage - 1 + embeds.length) % embeds.length; - } + const collector = message.createMessageComponentCollector({ time: 60_000 }); + collector.on('collect', async i => { + if (i.user.id !== interaction.user.id) { + return i.reply({ content: '❌ Ce n\'est pas ton menu !', flags: MessageFlags.Ephemeral }); + } + if (i.customId === 'next') { + currentPage = (currentPage + 1) % embeds.length; + } + if (i.customId === 'prev') { + currentPage = (currentPage - 1 + embeds.length) % embeds.length; + } - await i.update({ embeds: [embeds[currentPage]] }); - }); + await i.update({ embeds: [embeds[currentPage]] }); + }); - collector.on('end', () => { - message.edit({ components: [] }).catch(() => null); - }); + collector.on('end', () => { + message.edit({ components: [] }).catch(() => null); + }); - } catch (err) { - console.error('Erreur lors de la récupération du casier:', err); - await interaction.editReply({ content: '❌ Une erreur est survenue lors de la récupération du casier.' }); - } - }, -}; + } catch (err) { + console.error('Erreur casier:', err); + await interaction.editReply({ content: '❌ Une erreur est survenue lors de la récupération du casier.' }); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/changemute.js b/commands/moderation/changemute.js index d4a78d2..4a52595 100644 --- a/commands/moderation/changemute.js +++ b/commands/moderation/changemute.js @@ -1,172 +1,149 @@ -const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder } = require('discord.js'); +const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); -const { parseDuration, formatDuration } = require('../../utils/helpers'); +const { parseDuration, formatDuration, sendLog } = require('../../utils/helpers'); +const { colors, emojis } = require('../../utils/constants'); module.exports = { - category: 'moderation', - data: new SlashCommandBuilder() - .setName('changemute') - .setDescription('Changer le temps ou la raison d\'un mute.') - .addUserOption(option => - option.setName('user') - .setDescription('Le membre concerné') - .setRequired(true)) - .addStringOption(option => - option.setName('time') - .setDescription('Nouvelle durée du mute (ex: 5m, 1h, 1d)') - .setRequired(false)) - .addStringOption(option => - option.setName('reason') - .setDescription('Nouvelle raison du mute') - .setRequired(false)) - .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers), + category: 'moderation', + data: new SlashCommandBuilder() + .setName('changemute') + .setDescription('Changer le temps ou la raison d\'un mute.') + .addUserOption(option => + option.setName('user') + .setDescription('Le membre concerné') + .setRequired(true)) + .addStringOption(option => + option.setName('time') + .setDescription('Nouvelle durée du mute (ex: 5m, 1h, 1d)') + .setRequired(false)) + .addStringOption(option => + option.setName('reason') + .setDescription('Nouvelle raison du mute') + .setRequired(false)) + .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers), - async execute(interaction) { - const target = interaction.options.getUser('user'); - const newTime = interaction.options.getString('time'); - const newReason = interaction.options.getString('reason'); + async execute(interaction) { + const target = interaction.options.getUser('user'); + const newTime = interaction.options.getString('time'); + const newReason = interaction.options.getString('reason'); - await interaction.deferReply({ ephemeral: true }); + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); - if (!target) { - return interaction.editReply({ content: '❌ Aucun utilisateur spécifié !' }); - } + if (!target) return interaction.editReply({ content: '❌ Aucun utilisateur spécifié !' }); - const member = await interaction.guild.members.fetch(target.id).catch(() => null); - if (!member) { - return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas sur le serveur.' }); - } + const member = await interaction.guild.members.fetch(target.id).catch(() => null); + if (!member) return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas sur le serveur.' }); - if (!newTime && !newReason) { - return interaction.editReply({ content: '❌ Tu dois spécifier au moins une nouvelle durée ou une nouvelle raison.' }); - } + if (!newTime && !newReason) return interaction.editReply({ content: '❌ Tu dois spécifier au moins une nouvelle durée ou une nouvelle raison.' }); - // Récupérer le mute actuel depuis la DB - const [muteRows] = await db.query( - 'SELECT * FROM mutes WHERE userId = ? AND guildId = ?', - [target.id, interaction.guild.id] - ); + const [muteRows] = await db.query( + 'SELECT * FROM mutes WHERE userId = ? AND guildId = ?', + [target.id, interaction.guild.id] + ); - if (!muteRows.length && !member.communicationDisabledUntil) { - return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas muté.' }); - } + if (!muteRows.length && (!member.communicationDisabledUntilTimestamp || member.communicationDisabledUntilTimestamp < Date.now())) { + return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas muté.' }); + } - const currentMute = muteRows[0]; - const oldReason = currentMute?.reason || 'N/A'; - const oldUnmuteDate = currentMute?.unmuteDate || null; + const currentMute = muteRows[0]; + const oldReason = currentMute?.reason || 'N/A'; + const oldUnmuteDate = currentMute?.unmuteDate || null; - try { - let newUnmuteDate = oldUnmuteDate; - let newDurationMs = null; - let durationText = 'Non modifié'; + try { + let newUnmuteDate = oldUnmuteDate; + let newDurationMs = null; + let durationText = 'Non modifié'; - // Si nouvelle durée spécifiée - if (newTime) { - newDurationMs = parseDuration(newTime); - if (!newDurationMs) { - return interaction.editReply({ content: '❌ Durée invalide. Utilise un format comme: 5m, 1h, 2d (max 28 jours).' }); - } + if (newTime) { + newDurationMs = parseDuration(newTime); + if (!newDurationMs) return interaction.editReply({ content: '❌ Durée invalide. Utilise un format comme: 5m, 1h, 2d (max 28 jours).' }); - const maxDuration = 28 * 24 * 60 * 60 * 1000; - if (newDurationMs > maxDuration) { - return interaction.editReply({ content: '❌ La durée maximum est de 28 jours.' }); - } + const maxDuration = 28 * 24 * 60 * 60 * 1000; + if (newDurationMs > maxDuration) return interaction.editReply({ content: '❌ La durée maximum est de 28 jours.' }); - newUnmuteDate = Date.now() + newDurationMs; - durationText = formatDuration(newDurationMs); + newUnmuteDate = Date.now() + newDurationMs; + durationText = formatDuration(newDurationMs); - // Mettre à jour le timeout - const durationSeconds = Math.floor(newDurationMs / 1000); - await member.timeout(durationSeconds * 1000, `Mute modifié par ${interaction.user.tag}: ${newReason || oldReason}`); - } + await member.timeout(newDurationMs, `Mute modifié par ${interaction.user.tag}: ${newReason || oldReason}`); + } - // Mettre à jour la DB - const finalReason = newReason || oldReason; - const type = newUnmuteDate && newUnmuteDate > Date.now() ? 'Temporary' : 'Permanent'; + const finalReason = newReason || oldReason; + const type = 'Temporary'; - if (currentMute) { - await db.query( - 'UPDATE mutes SET reason = ?, modId = ?, modTag = ?, timestamp = ?, unmuteDate = ?, type = ? WHERE userId = ? AND guildId = ?', - [finalReason, interaction.user.id, interaction.user.tag, Date.now(), newUnmuteDate, type, target.id, interaction.guild.id] - ); - } else { - await db.query( - `INSERT INTO mutes (userId, guildId, reason, modId, modTag, timestamp, unmuteDate, type) - VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, - [target.id, interaction.guild.id, finalReason, interaction.user.id, interaction.user.tag, Date.now(), newUnmuteDate, type] - ); - } + if (currentMute) { + await db.query( + 'UPDATE mutes SET reason = ?, modId = ?, modTag = ?, timestamp = ?, unmuteDate = ?, type = ? WHERE userId = ? AND guildId = ?', + [finalReason, interaction.user.id, interaction.user.tag, Date.now(), newUnmuteDate, type, target.id, interaction.guild.id] + ); + } else { + await db.query( + `INSERT INTO mutes (userId, guildId, reason, modId, modTag, timestamp, unmuteDate, type) + VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, + [target.id, interaction.guild.id, finalReason, interaction.user.id, interaction.user.tag, Date.now(), newUnmuteDate, type] + ); + } - // Log dans la DB - const changeLog = []; - if (newTime) changeLog.push(`Durée: ${formatDuration(newDurationMs)}`); - if (newReason) changeLog.push(`Raison: ${oldReason} → ${newReason}`); - const changeReason = changeLog.join(', '); + const changeLog = []; + if (newTime) changeLog.push(`Durée: ${formatDuration(newDurationMs)}`); + if (newReason) changeLog.push(`Raison: ${oldReason} → ${newReason}`); + const changeReason = changeLog.join(', '); - await db.query( - `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, - [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Modification de mute', changeReason, type, interaction.guild.id, Date.now()] - ); + await db.query( + `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Modification de mute', changeReason, type, interaction.guild.id, Date.now()] + ); - const { colors, emojis } = require('../../utils/constants'); - const { sendLog } = require('../../utils/helpers'); + const embed = new EmbedBuilder() + .setTitle(`${emojis.success} Mute Modifié`) + .setColor(colors.success) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .addFields( + { name: '👤 Utilisateur', value: `<@${target.id}> (${target.tag})`, inline: true }, + { name: '🔧 Modérateur', value: `<@${interaction.user.id}> (${interaction.user.tag})`, inline: true }, + { name: '⏰ Nouvelle durée', value: durationText, inline: true }, + { name: '📝 Ancienne raison', value: oldReason, inline: false }, + { name: '📝 Nouvelle raison', value: finalReason, inline: false } + ) + .setFooter({ text: `ID: ${target.id}` }) + .setTimestamp(); - const embed = new EmbedBuilder() - .setTitle(`${emojis.success} Mute Modifié`) - .setColor(colors.success) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .addFields( - { name: '👤 Utilisateur', value: `<@${target.id}> (${target.tag})`, inline: true }, - { name: '🔧 Modérateur', value: `<@${interaction.user.id}> (${interaction.user.tag})`, inline: true }, - { name: '⏰ Nouvelle durée', value: durationText, inline: true }, - { name: '📝 Ancienne raison', value: oldReason, inline: false }, - { name: '📝 Nouvelle raison', value: finalReason, inline: false } - ) - .setFooter({ text: `ID: ${target.id}` }) - .setTimestamp(); + if (newUnmuteDate) { + embed.addFields({ name: '📅 Démute le', value: ``, inline: true }); + } - if (newUnmuteDate) { - embed.addFields({ name: '📅 Démute le', value: ``, inline: true }); - } + await interaction.editReply({ embeds: [embed] }); - await interaction.editReply({ embeds: [embed] }); + try { + const dmEmbed = new EmbedBuilder() + .setTitle(`${emojis.info} Ton mute a été modifié`) + .setColor(colors.info) + .setDescription(`Ton mute sur **${interaction.guild.name}** a été modifié`) + .addFields( + { name: '⏰ Durée', value: durationText, inline: true }, + { name: '📝 Raison', value: finalReason, inline: false } + ) + .setFooter({ text: interaction.guild.name, iconURL: interaction.guild.iconURL({ dynamic: true }) }) + .setTimestamp(); + await target.send({ embeds: [dmEmbed] }); + } catch { /* DMs fermés */ } - // Envoyer un message privé à l'utilisateur - try { - const dmEmbed = new EmbedBuilder() - .setTitle(`${emojis.info} Ton mute a été modifié`) - .setColor(colors.info) - .setDescription(`Ton mute sur **${interaction.guild.name}** a été modifié`) - .addFields( - { name: '⏰ Durée', value: durationText, inline: true }, - { name: '📝 Raison', value: finalReason, inline: false } - ) - .setFooter({ text: interaction.guild.name, iconURL: interaction.guild.iconURL({ dynamic: true }) }) - .setTimestamp(); - await target.send({ embeds: [dmEmbed] }); - } catch { - // L'utilisateur a les DMs fermés, on continue - } - - // Log dans le canal de logs - const logEmbed = new EmbedBuilder() - .setTitle(`${emojis.success} Modification de Mute`) - .setColor(colors.success) - .addFields( - { name: '👤 Utilisateur', value: `<@${target.id}> (${target.tag})`, inline: true }, - { name: '🔧 Modérateur', value: `<@${interaction.user.id}> (${interaction.user.tag})`, inline: true }, - { name: '📝 Modifications', value: changeReason, inline: false }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id} | Serveur: ${interaction.guild.name}` }) - .setTimestamp(); - await sendLog(interaction.guild, { embeds: [logEmbed] }); - - } catch (err) { - console.error('Erreur lors de la modification du mute:', err); - await interaction.editReply({ content: `❌ Échec de la modification du mute: ${err.message}` }); - } - }, -}; + const logEmbed = new EmbedBuilder() + .setTitle(`${emojis.success} Modification de Mute`) + .setColor(colors.success) + .addFields( + { name: '👤 Utilisateur', value: `<@${target.id}> (${target.tag})`, inline: true }, + { name: '🔧 Modérateur', value: `<@${interaction.user.id}> (${interaction.user.tag})`, inline: true }, + { name: '📝 Modifications', value: changeReason, inline: false }, + { name: '📅 Date', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${target.id} | Serveur: ${interaction.guild.name}` }) + .setTimestamp(); + await sendLog(interaction.guild, { embeds: [logEmbed] }); + } catch (err) { + console.error('Erreur changemute:', err); + await interaction.editReply({ content: `❌ Échec de la modification du mute: ${err.message}` }); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/changesanction.js b/commands/moderation/changesanction.js index a14fa0c..b86fd60 100644 --- a/commands/moderation/changesanction.js +++ b/commands/moderation/changesanction.js @@ -1,125 +1,114 @@ -const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder } = require('discord.js'); +const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); +const { sendLog } = require('../../utils/helpers'); +const { colors, emojis } = require('../../utils/constants'); module.exports = { - category: 'moderation', - data: new SlashCommandBuilder() - .setName('changesanction') - .setDescription('Changer la raison d\'une sanction.') - .addUserOption(option => - option.setName('user') - .setDescription('L\'utilisateur concerné') - .setRequired(true)) - .addIntegerOption(option => - option.setName('sanction_id') - .setDescription('L\'ID DB de la sanction (visible dans /casier, ex: ID: 123)') - .setRequired(true)) - .addStringOption(option => - option.setName('new_reason') - .setDescription('La nouvelle raison') - .setRequired(true)) - .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers), - async execute(interaction) { - const target = interaction.options.getUser('user'); - const sanctionId = interaction.options.getInteger('sanction_id'); - const newReason = interaction.options.getString('new_reason'); + category: 'moderation', + data: new SlashCommandBuilder() + .setName('changesanction') + .setDescription('Changer la raison d\'une sanction.') + .addUserOption(option => + option.setName('user') + .setDescription('L\'utilisateur concerné') + .setRequired(true)) + .addIntegerOption(option => + option.setName('sanction_id') + .setDescription('L\'ID DB de la sanction (visible dans /casier, ex: ID: 123)') + .setRequired(true)) + .addStringOption(option => + option.setName('new_reason') + .setDescription('La nouvelle raison') + .setRequired(true)) + .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers), - await interaction.deferReply({ ephemeral: true }); + async execute(interaction) { + const target = interaction.options.getUser('user'); + const sanctionId = interaction.options.getInteger('sanction_id'); + const newReason = interaction.options.getString('new_reason'); - try { - console.log(`[changesanction] Recherche sanction ID: ${sanctionId}, userId: ${target.id}, guildId: ${interaction.guild.id}`); - - // Récupérer directement la sanction par son ID DB (plus stable) - const [sanctionRows] = await db.query( - 'SELECT * FROM logs WHERE id = ? AND userId = ? AND guildId = ?', - [sanctionId, target.id, interaction.guild.id] - ); + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); - console.log(`[changesanction] Résultats trouvés: ${sanctionRows.length}`); + try { + const [sanctionRows] = await db.query( + 'SELECT * FROM logs WHERE id = ? AND userId = ? AND guildId = ?', + [sanctionId, target.id, interaction.guild.id] + ); - if (!sanctionRows.length) { - // Vérifier si l'ID existe pour cet utilisateur (peut-être mauvais serveur?) - const [allUserLogs] = await db.query( - 'SELECT id, action, guildId FROM logs WHERE id = ? AND userId = ?', - [sanctionId, target.id] - ); - - if (allUserLogs.length > 0) { - const log = allUserLogs[0]; - const guildName = interaction.client.guilds.cache.get(log.guildId)?.name || 'Serveur inconnu'; - return interaction.editReply({ - content: `❌ La sanction avec l'ID ${sanctionId} existe, mais elle appartient au serveur "${guildName}" (guildId: ${log.guildId}), pas à "${interaction.guild.name}" (guildId: ${interaction.guild.id}).` - }); - } - - return interaction.editReply({ - content: `❌ Aucune sanction trouvée avec l'ID ${sanctionId} pour ${target.tag}.\n\n💡 **Astuce:** Utilise l'ID DB visible dans \`/casier\` (ex: \`#1 (ID: 123)\` → utilise \`123\`).` - }); - } + if (!sanctionRows.length) { + const [allUserLogs] = await db.query( + 'SELECT id, action, guildId FROM logs WHERE id = ? AND userId = ?', + [sanctionId, target.id] + ); + + if (allUserLogs.length > 0) { + const log = allUserLogs[0]; + const guildName = interaction.client.guilds.cache.get(log.guildId)?.name || 'Serveur inconnu'; + return interaction.editReply({ + content: `❌ La sanction avec l'ID ${sanctionId} existe, mais elle appartient au serveur "${guildName}" (guildId: ${log.guildId}), pas à "${interaction.guild.name}" (guildId: ${interaction.guild.id}).` + }); + } + + return interaction.editReply({ + content: `❌ Aucune sanction trouvée avec l'ID ${sanctionId} pour ${target.tag}.\n\n💡 **Astuce:** Utilise l'ID DB visible dans \`/casier\` (ex: \`#1 (ID: 123)\` → utilise \`123\`).` + }); + } - const sanction = sanctionRows[0]; + const sanction = sanctionRows[0]; - // Vérifier que ce n'est pas une modification/révocation - if (sanction.action === 'Modification de sanction' || - sanction.action === 'Révocation de sanction' || - sanction.action === 'Modification de mute') { - return interaction.editReply({ content: `❌ Cette entrée est une modification, pas une sanction. Utilise l'ID d'une vraie sanction.` }); - } - const oldReason = sanction.reason; + if (sanction.action === 'Modification de sanction' || + sanction.action === 'Révocation de sanction' || + sanction.action === 'Modification de mute') { + return interaction.editReply({ content: `❌ Cette entrée est une modification, pas une sanction. Utilise l'ID d'une vraie sanction.` }); + } + const oldReason = sanction.reason; - // Mettre à jour la raison - await db.query( - 'UPDATE logs SET reason = ?, modId = ?, modTag = ? WHERE id = ?', - [newReason, interaction.user.id, interaction.user.tag, sanction.id] - ); + await db.query( + 'UPDATE logs SET reason = ?, modId = ?, modTag = ? WHERE id = ?', + [newReason, interaction.user.id, interaction.user.tag, sanction.id] + ); - // Log de la modification - await db.query( - `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, - [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Modification de sanction', `Ancienne raison: ${oldReason} → Nouvelle raison: ${newReason}`, null, interaction.guild.id, Date.now()] - ); + await db.query( + `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Modification de sanction', `Ancienne raison: ${oldReason} → Nouvelle raison: ${newReason}`, null, interaction.guild.id, Date.now()] + ); - const { colors, emojis } = require('../../utils/constants'); - const { sendLog } = require('../../utils/helpers'); + const embed = new EmbedBuilder() + .setTitle(`${emojis.success} Sanction Modifiée`) + .setColor(colors.success) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .addFields( + { name: '👤 Utilisateur', value: `<@${target.id}> (${target.tag})`, inline: true }, + { name: '🔧 Modérateur', value: `<@${interaction.user.id}> (${interaction.user.tag})`, inline: true }, + { name: '📝 Ancienne raison', value: oldReason || 'N/A', inline: false }, + { name: '📝 Nouvelle raison', value: newReason, inline: false }, + { name: '🆔 ID Sanction', value: `${sanction.id}`, inline: true }, + { name: '📅 Date', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${target.id}` }) + .setTimestamp(); - const embed = new EmbedBuilder() - .setTitle(`${emojis.success} Sanction Modifiée`) - .setColor(colors.success) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .addFields( - { name: '👤 Utilisateur', value: `<@${target.id}> (${target.tag})`, inline: true }, - { name: '🔧 Modérateur', value: `<@${interaction.user.id}> (${interaction.user.tag})`, inline: true }, - { name: '📝 Ancienne raison', value: oldReason || 'N/A', inline: false }, - { name: '📝 Nouvelle raison', value: newReason, inline: false }, - { name: '🆔 ID Sanction', value: `${sanction.id}`, inline: true }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id}` }) - .setTimestamp(); + await interaction.editReply({ embeds: [embed] }); - await interaction.editReply({ embeds: [embed] }); - - // Log dans le canal de logs - const logEmbed = new EmbedBuilder() - .setTitle(`${emojis.success} Modification de Sanction`) - .setColor(colors.success) - .addFields( - { name: '👤 Utilisateur', value: `<@${target.id}> (${target.tag})`, inline: true }, - { name: '🔧 Modérateur', value: `<@${interaction.user.id}> (${interaction.user.tag})`, inline: true }, - { name: '📝 Ancienne raison', value: oldReason || 'N/A', inline: false }, - { name: '📝 Nouvelle raison', value: newReason, inline: false }, - { name: '🆔 ID Sanction', value: `${sanction.id}`, inline: true }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id} | Serveur: ${interaction.guild.name}` }) - .setTimestamp(); - await sendLog(interaction.guild, { embeds: [logEmbed] }); - - } catch (err) { - console.error('Erreur lors de la modification de la sanction:', err); - await interaction.editReply({ content: `❌ Échec de la modification de la sanction: ${err.message}` }); - } - }, -}; + const logEmbed = new EmbedBuilder() + .setTitle(`${emojis.success} Modification de Sanction`) + .setColor(colors.success) + .addFields( + { name: '👤 Utilisateur', value: `<@${target.id}> (${target.tag})`, inline: true }, + { name: '🔧 Modérateur', value: `<@${interaction.user.id}> (${interaction.user.tag})`, inline: true }, + { name: '📝 Ancienne raison', value: oldReason || 'N/A', inline: false }, + { name: '📝 Nouvelle raison', value: newReason, inline: false }, + { name: '🆔 ID Sanction', value: `${sanction.id}`, inline: true }, + { name: '📅 Date', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${target.id} | Serveur: ${interaction.guild.name}` }) + .setTimestamp(); + await sendLog(interaction.guild, { embeds: [logEmbed] }); + } catch (err) { + console.error('Erreur changesanction:', err); + await interaction.editReply({ content: `❌ Échec de la modification de la sanction: ${err.message}` }); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/clear.js b/commands/moderation/clear.js index ea0ebcd..eb37743 100644 --- a/commands/moderation/clear.js +++ b/commands/moderation/clear.js @@ -1,85 +1,74 @@ -const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder } = require('discord.js'); +const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder, MessageFlags } = require('discord.js'); +const { colors, emojis } = require('../../utils/constants'); module.exports = { - category: 'moderation', - data: new SlashCommandBuilder() - .setName('clear') - .setDescription('Supprimer plusieurs messages d\'un coup.') - .addIntegerOption(option => - option.setName('amount') - .setDescription('Nombre de messages à supprimer (1-100)') - .setRequired(true) - .setMinValue(1) - .setMaxValue(100)) - .addUserOption(option => - option.setName('target') - .setDescription('Supprimer uniquement les messages de cet utilisateur') - .setRequired(false)) - .setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages), + category: 'moderation', + data: new SlashCommandBuilder() + .setName('clear') + .setDescription('Supprimer plusieurs messages d\'un coup.') + .addIntegerOption(option => + option.setName('amount') + .setDescription('Nombre de messages à supprimer (1-100)') + .setRequired(true) + .setMinValue(1) + .setMaxValue(100)) + .addUserOption(option => + option.setName('target') + .setDescription('Supprimer uniquement les messages de cet utilisateur') + .setRequired(false)) + .setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages), - async execute(interaction) { - const amount = interaction.options.getInteger('amount'); - const target = interaction.options.getUser('target'); + async execute(interaction) { + const amount = interaction.options.getInteger('amount'); + const target = interaction.options.getUser('target'); - await interaction.deferReply({ ephemeral: true }); + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); - if (!interaction.channel.isTextBased()) { - return interaction.editReply({ content: '❌ Cette commande ne peut être utilisée que dans un canal texte.' }); - } + if (!interaction.channel.isTextBased()) { + return interaction.editReply({ content: '❌ Cette commande ne peut être utilisée que dans un canal texte.' }); + } - try { - const messages = await interaction.channel.messages.fetch({ limit: amount }); - let messagesToDelete = messages; + try { + const messages = await interaction.channel.messages.fetch({ limit: amount }); + let messagesToDelete = messages; - if (target) { - messagesToDelete = messages.filter(msg => msg.author.id === target.id); - } + if (target) { + messagesToDelete = messages.filter(msg => msg.author.id === target.id); + } - // Ne pas supprimer les messages de plus de 14 jours - const filteredMessages = messagesToDelete.filter(msg => { - const msgAge = Date.now() - msg.createdTimestamp; - return msgAge < 14 * 24 * 60 * 60 * 1000; - }); + const filteredMessages = messagesToDelete.filter(msg => { + const msgAge = Date.now() - msg.createdTimestamp; + return msgAge < 14 * 24 * 60 * 60 * 1000; + }); - if (filteredMessages.size === 0) { - return interaction.editReply({ content: '❌ Aucun message à supprimer (les messages de plus de 14 jours ne peuvent pas être supprimés).' }); - } + if (filteredMessages.size === 0) { + return interaction.editReply({ content: '❌ Aucun message à supprimer (les messages de plus de 14 jours ne peuvent pas être supprimés).' }); + } - await interaction.channel.bulkDelete(filteredMessages, true); + await interaction.channel.bulkDelete(filteredMessages, true); - const { colors, emojis } = require('../../utils/constants'); + const embed = new EmbedBuilder() + .setAuthor({ name: interaction.user.displayName, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }) + .setTitle(`${emojis.success} Messages Supprimés`) + .setColor(colors.success) + .setDescription(`**${filteredMessages.size}** message(s) supprimé(s)${target ? ` de ${target.toString()}` : ''}.`) + .addFields( + { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, + { name: '📊 Messages supprimés', value: `\`${filteredMessages.size}\``, inline: true }, + { name: '📅 Date', value: ``, inline: true } + ) + .setFooter({ text: `${interaction.guild.name} • ${interaction.channel.name}` }) + .setTimestamp(); - const embed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.user.displayName}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.success} Messages Supprimés`) - .setColor(colors.success) - .setDescription(`**${filteredMessages.size}** message(s) supprimé(s)${target ? ` de ${target.toString()}` : ''}.`) - .addFields( - { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, - { name: '📊 Messages supprimés', value: `\`${filteredMessages.size}\``, inline: true }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `${interaction.guild.name} • ${interaction.channel.name}` }) - .setTimestamp(); - - await interaction.editReply({ embeds: [embed] }); - - // Supprimer le message de confirmation après 5 secondes - setTimeout(() => { - interaction.deleteReply().catch(() => null); - }, 5000); - - } catch (err) { - console.error('Erreur lors de la suppression des messages:', err); - if (err.code === 50034) { - await interaction.editReply({ content: '❌ Les messages de plus de 14 jours ne peuvent pas être supprimés.' }); - } else { - await interaction.editReply({ content: `❌ Échec de la suppression des messages: ${err.message}` }); - } - } - }, -}; + await interaction.editReply({ embeds: [embed] }); + } catch (err) { + console.error('Erreur clear:', err); + if (err.code === 50034) { + await interaction.editReply({ content: '❌ Les messages de plus de 14 jours ne peuvent pas être supprimés.' }); + } else { + await interaction.editReply({ content: `❌ Échec de la suppression: ${err.message}` }); + } + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/kick.js b/commands/moderation/kick.js index 6fd470d..8231994 100644 --- a/commands/moderation/kick.js +++ b/commands/moderation/kick.js @@ -1,111 +1,89 @@ -const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder } = require('discord.js'); +const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); +const { sendLog } = require('../../utils/helpers'); +const { colors, emojis } = require('../../utils/constants'); module.exports = { - category: 'moderation', - data: new SlashCommandBuilder() - .setName('kick') - .setDescription('Expulser un membre du serveur.') - .addUserOption(option => - option.setName('target') - .setDescription('Le membre à expulser') - .setRequired(true)) - .addStringOption(option => - option.setName('reason') - .setDescription('Raison de l\'expulsion') - .setRequired(false)) - .setDefaultMemberPermissions(PermissionFlagsBits.KickMembers), + category: 'moderation', + data: new SlashCommandBuilder() + .setName('kick') + .setDescription('Expulser un membre du serveur.') + .addUserOption(option => + option.setName('target') + .setDescription('Le membre à expulser') + .setRequired(true)) + .addStringOption(option => + option.setName('reason') + .setDescription('Raison de l\'expulsion') + .setRequired(false)) + .setDefaultMemberPermissions(PermissionFlagsBits.KickMembers), - async execute(interaction) { - const target = interaction.options.getUser('target'); - const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; + async execute(interaction) { + const target = interaction.options.getUser('target'); + const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; - await interaction.deferReply(); + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); - if (!target) { - return interaction.editReply({ content: '❌ Aucun utilisateur spécifié !' }); - } + if (!target) return interaction.editReply({ content: '❌ Aucun utilisateur spécifié !' }); - const member = await interaction.guild.members.fetch(target.id).catch(() => null); - if (!member) { - return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas sur le serveur.' }); - } + const member = await interaction.guild.members.fetch(target.id).catch(() => null); + if (!member) return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas sur le serveur.' }); - // Vérifications de permissions - if (member.id === interaction.guild.ownerId) { - return interaction.editReply({ content: '❌ Tu ne peux pas expulser le propriétaire du serveur.' }); - } - if (member.id === interaction.user.id) { - return interaction.editReply({ content: '❌ Tu ne peux pas t\'expulser toi-même.' }); - } - if (member.roles.highest.position >= interaction.member.roles.highest.position && interaction.guild.ownerId !== interaction.user.id) { - return interaction.editReply({ content: '❌ Tu ne peux pas expulser cet utilisateur car il a un rôle supérieur ou égal au tien.' }); - } - if (!member.kickable) { - return interaction.editReply({ content: '❌ Je n\'ai pas les permissions nécessaires pour expulser cet utilisateur.' }); - } + if (member.id === interaction.guild.ownerId) return interaction.editReply({ content: '❌ Tu ne peux pas expulser le propriétaire du serveur.' }); + if (member.id === interaction.user.id) return interaction.editReply({ content: '❌ Tu ne peux pas t\'expulser toi-même.' }); + + if (member.roles.highest.position >= interaction.member.roles.highest.position && interaction.guild.ownerId !== interaction.user.id) { + return interaction.editReply({ content: '❌ Tu ne peux pas expulser cet utilisateur car il a un rôle supérieur ou égal au tien.' }); + } + if (!member.kickable) { + return interaction.editReply({ content: '❌ Je n\'ai pas les permissions nécessaires pour expulser cet utilisateur.' }); + } - try { - await member.kick(`Expulsé par ${interaction.user.tag}: ${reason}`); + try { + await member.kick(`Expulsé par ${interaction.user.tag}: ${reason}`); - // Log dans la DB - await db.query( - `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, - [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Expulsion', reason, null, interaction.guild.id, Date.now()] - ); + await db.query( + `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Expulsion', reason, null, interaction.guild.id, Date.now()] + ); - const { colors, emojis } = require('../../utils/constants'); - const { sendLog } = require('../../utils/helpers'); + const embed = new EmbedBuilder() + .setAuthor({ name: target.displayName, iconURL: target.displayAvatarURL({ dynamic: true }) }) + .setTitle(`${emojis.kick} Utilisateur Expulsé`) + .setColor(colors.kick) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .setDescription(`${target.toString()} a été expulsé du serveur.`) + .addFields( + { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, + { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, + { name: '📝 Raison', value: reason, inline: false }, + { name: '📅 Date', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) + .setTimestamp(); - const embed = new EmbedBuilder() - .setAuthor({ - name: `${target.displayName}`, - iconURL: target.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.kick} Utilisateur Expulsé`) - .setColor(colors.kick) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .setDescription(`${target.toString()} a été expulsé du serveur.`) - .addFields( - { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, - { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, - { name: '📝 Raison', value: reason, inline: false }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) - .setTimestamp(); + await interaction.editReply({ embeds: [embed] }); - await interaction.editReply({ embeds: [embed] }); - - // Log dans le canal de logs - const logEmbed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.user.displayName}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.kick} Expulsion`) - .setColor(colors.kick) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .setDescription(`${target.toString()} a été expulsé du serveur.`) - .addFields( - { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, - { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, - { name: '📝 Raison', value: reason, inline: false }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) - .setTimestamp(); - await sendLog(interaction.guild, { embeds: [logEmbed] }); - - } catch (err) { - console.error('Erreur lors de l\'expulsion:', err); - if (err.code === 50013) { - await interaction.editReply({ content: '❌ Je n\'ai pas les permissions nécessaires pour expulser cet utilisateur.' }); - } else { - await interaction.editReply({ content: `❌ Échec de l'expulsion de ${target.tag}: ${err.message}` }); - } - } - }, -}; + const logEmbed = new EmbedBuilder() + .setAuthor({ name: interaction.user.displayName, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }) + .setTitle(`${emojis.kick} Expulsion`) + .setColor(colors.kick) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .setDescription(`${target.toString()} a été expulsé du serveur.`) + .addFields( + { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, + { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, + { name: '📝 Raison', value: reason, inline: false } + ) + .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) + .setTimestamp(); + + await sendLog(interaction.guild, { embeds: [logEmbed] }); + } catch (err) { + console.error('Erreur kick:', err); + await interaction.editReply({ content: `❌ Erreur: ${err.message}` }); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/mute.js b/commands/moderation/mute.js index 45706a8..559a0e7 100644 --- a/commands/moderation/mute.js +++ b/commands/moderation/mute.js @@ -1,144 +1,113 @@ -const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder } = require('discord.js'); +const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); -const { parseDuration, formatDuration } = require('../../utils/helpers'); +const { parseDuration, formatDuration, sendLog } = require('../../utils/helpers'); +const { colors, emojis } = require('../../utils/constants'); module.exports = { - category: 'moderation', - data: new SlashCommandBuilder() - .setName('mute') - .setDescription('Muter un membre du serveur.') - .addUserOption(option => - option.setName('user') - .setDescription('Le membre à muter') - .setRequired(true)) - .addStringOption(option => - option.setName('duration') - .setDescription('Durée du mute (ex: 5m, 1h, 1d, max 28j)') - .setRequired(true)) - .addStringOption(option => - option.setName('reason') - .setDescription('Raison du mute') - .setRequired(false)) - .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers), + category: 'moderation', + data: new SlashCommandBuilder() + .setName('mute') + .setDescription('Muter un membre du serveur.') + .addUserOption(option => + option.setName('user') + .setDescription('Le membre à muter') + .setRequired(true)) + .addStringOption(option => + option.setName('duration') + .setDescription('Durée du mute (ex: 5m, 1h, 1d, max 28j)') + .setRequired(true)) + .addStringOption(option => + option.setName('reason') + .setDescription('Raison du mute') + .setRequired(false)) + .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers), - async execute(interaction) { - const target = interaction.options.getUser('user'); - const durationInput = interaction.options.getString('duration'); - const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; + async execute(interaction) { + const target = interaction.options.getUser('user'); + const durationInput = interaction.options.getString('duration'); + const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; - await interaction.deferReply({ ephemeral: true }); + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); - if (!target) { - return interaction.editReply({ content: '❌ Aucun utilisateur spécifié !' }); - } + if (!target) return interaction.editReply({ content: '❌ Aucun utilisateur spécifié !' }); - const member = await interaction.guild.members.fetch(target.id).catch(() => null); - if (!member) { - return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas sur le serveur.' }); - } + const member = await interaction.guild.members.fetch(target.id).catch(() => null); + if (!member) return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas sur le serveur.' }); - // Vérifications - if (member.id === interaction.guild.ownerId) { - return interaction.editReply({ content: '❌ Tu ne peux pas muter le propriétaire du serveur.' }); - } - if (member.id === interaction.user.id) { - return interaction.editReply({ content: '❌ Tu ne peux pas te muter toi-même.' }); - } - if (member.roles.highest.position >= interaction.member.roles.highest.position && interaction.guild.ownerId !== interaction.user.id) { - return interaction.editReply({ content: '❌ Tu ne peux pas muter cet utilisateur car il a un rôle supérieur ou égal au tien.' }); - } - if (!member.moderatable) { - return interaction.editReply({ content: '❌ Je n\'ai pas les permissions nécessaires pour muter cet utilisateur.' }); - } + if (member.id === interaction.guild.ownerId) return interaction.editReply({ content: '❌ Tu ne peux pas muter le propriétaire du serveur.' }); + if (member.id === interaction.user.id) return interaction.editReply({ content: '❌ Tu ne peux pas te muter toi-même.' }); + + if (member.roles.highest.position >= interaction.member.roles.highest.position && interaction.guild.ownerId !== interaction.user.id) { + return interaction.editReply({ content: '❌ Tu ne peux pas muter cet utilisateur car il a un rôle supérieur ou égal au tien.' }); + } + if (!member.moderatable) { + return interaction.editReply({ content: '❌ Je n\'ai pas les permissions nécessaires pour muter cet utilisateur.' }); + } - // Parser la durée - const durationMs = parseDuration(durationInput); - if (!durationMs) { - return interaction.editReply({ content: '❌ Durée invalide. Utilise un format comme: 5m, 1h, 2d (max 28 jours).' }); - } + const durationMs = parseDuration(durationInput); + if (!durationMs) return interaction.editReply({ content: '❌ Durée invalide. Utilise un format comme: 5m, 1h, 2d (max 28 jours).' }); - // Maximum 28 jours (Discord limit) - const maxDuration = 28 * 24 * 60 * 60 * 1000; - if (durationMs > maxDuration) { - return interaction.editReply({ content: '❌ La durée maximum est de 28 jours.' }); - } + const maxDuration = 28 * 24 * 60 * 60 * 1000; + if (durationMs > maxDuration) return interaction.editReply({ content: '❌ La durée maximum est de 28 jours.' }); - const durationSeconds = Math.floor(durationMs / 1000); - const unmuteDate = Date.now() + durationMs; - const type = durationMs > 0 ? 'Temporary' : 'Permanent'; + const unmuteDate = Date.now() + durationMs; + const type = 'Temporary'; // Timeout est toujours temporaire - try { - // Muter avec timeout (Discord) - await member.timeout(durationSeconds * 1000, `Muté par ${interaction.user.tag}: ${reason}`); + try { + await member.timeout(durationMs, `Muté par ${interaction.user.tag}: ${reason}`); - // Stocker dans la DB - await db.query( - `INSERT INTO mutes (userId, guildId, reason, modId, modTag, timestamp, unmuteDate, type) - VALUES (?, ?, ?, ?, ?, ?, ?, ?) - ON DUPLICATE KEY UPDATE reason=VALUES(reason), modId=VALUES(modId), modTag=VALUES(modTag), timestamp=VALUES(timestamp), unmuteDate=VALUES(unmuteDate), type=VALUES(type)`, - [target.id, interaction.guild.id, reason, interaction.user.id, interaction.user.tag, Date.now(), unmuteDate, type] - ); + await db.query( + `INSERT INTO mutes (userId, guildId, reason, modId, modTag, timestamp, unmuteDate, type) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + ON DUPLICATE KEY UPDATE reason=VALUES(reason), modId=VALUES(modId), modTag=VALUES(modTag), timestamp=VALUES(timestamp), unmuteDate=VALUES(unmuteDate), type=VALUES(type)`, + [target.id, interaction.guild.id, reason, interaction.user.id, interaction.user.tag, Date.now(), unmuteDate, type] + ); - // Log dans la DB - await db.query( - `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, - [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Mute', reason, type, interaction.guild.id, Date.now()] - ); + await db.query( + `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Mute', reason, type, interaction.guild.id, Date.now()] + ); - const { colors, emojis } = require('../../utils/constants'); - const { sendLog } = require('../../utils/helpers'); + const embed = new EmbedBuilder() + .setAuthor({ name: target.displayName, iconURL: target.displayAvatarURL({ dynamic: true }) }) + .setTitle(`${emojis.mute} Utilisateur Muté`) + .setColor(colors.mute) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .setDescription(`${target.toString()} a été muté.`) + .addFields( + { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, + { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, + { name: '⏰ Durée', value: `\`${formatDuration(durationMs)}\``, inline: true }, + { name: '📝 Raison', value: reason, inline: false }, + { name: '📅 Jusqu\'à', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) + .setTimestamp(); - const embed = new EmbedBuilder() - .setAuthor({ - name: `${target.displayName}`, - iconURL: target.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.mute} Utilisateur Muté`) - .setColor(colors.mute) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .setDescription(`${target.toString()} a été muté.`) - .addFields( - { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, - { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, - { name: '⏰ Durée', value: `\`${formatDuration(durationMs)}\``, inline: true }, - { name: '📝 Raison', value: reason, inline: false }, - { name: '📅 Jusqu\'à', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) - .setTimestamp(); + await interaction.editReply({ embeds: [embed] }); - await interaction.editReply({ embeds: [embed] }); - - // Log dans le canal de logs - const logEmbed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.user.displayName}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.mute} Mute`) - .setColor(colors.mute) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .setDescription(`${target.toString()} a été muté.`) - .addFields( - { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, - { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, - { name: '⏰ Durée', value: `\`${formatDuration(durationMs)}\``, inline: true }, - { name: '📝 Raison', value: reason, inline: false }, - { name: '📅 Jusqu\'à', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) - .setTimestamp(); - await sendLog(interaction.guild, { embeds: [logEmbed] }); - - } catch (err) { - console.error('Erreur lors du mute:', err); - if (err.code === 50013) { - await interaction.editReply({ content: '❌ Je n\'ai pas les permissions nécessaires pour muter cet utilisateur.' }); - } else { - await interaction.editReply({ content: `❌ Échec du mute de ${target.tag}: ${err.message}` }); - } - } - }, -}; + const logEmbed = new EmbedBuilder() + .setAuthor({ name: interaction.user.displayName, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }) + .setTitle(`${emojis.mute} Mute`) + .setColor(colors.mute) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .setDescription(`${target.toString()} a été muté.`) + .addFields( + { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, + { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, + { name: '⏰ Durée', value: `\`${formatDuration(durationMs)}\``, inline: true }, + { name: '📝 Raison', value: reason, inline: false }, + { name: '📅 Jusqu\'à', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) + .setTimestamp(); + + await sendLog(interaction.guild, { embeds: [logEmbed] }); + } catch (err) { + console.error('Erreur mute:', err); + await interaction.editReply({ content: `❌ Erreur: ${err.message}` }); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/mysanctions.js b/commands/moderation/mysanctions.js index 6d6d12f..a9d39ad 100644 --- a/commands/moderation/mysanctions.js +++ b/commands/moderation/mysanctions.js @@ -1,98 +1,97 @@ -const { SlashCommandBuilder, EmbedBuilder } = require('discord.js'); +const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); +const { colors } = require('../../utils/constants'); module.exports = { - category: 'moderation', - data: new SlashCommandBuilder() - .setName('mysanctions') - .setDescription('Voir tes propres sanctions sur ce serveur.'), - async execute(interaction) { - await interaction.deferReply({ ephemeral: true }); + category: 'moderation', + data: new SlashCommandBuilder() + .setName('mysanctions') + .setDescription('Voir tes propres sanctions sur ce serveur.'), + async execute(interaction) { + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); - const userId = interaction.user.id; + const userId = interaction.user.id; - try { - const [rows] = await db.query( - 'SELECT * FROM logs WHERE userId = ? AND guildId = ? ORDER BY timestamp DESC', - [userId, interaction.guild.id] - ); + try { + const [rows] = await db.query( + 'SELECT * FROM logs WHERE userId = ? AND guildId = ? ORDER BY timestamp DESC', + [userId, interaction.guild.id] + ); - if (!rows.length) { - return interaction.editReply({ content: '✅ Tu n\'as aucune sanction sur ce serveur.' }); - } + const sanctions = rows.filter(row => + row.action !== 'Modification de sanction' && + row.action !== 'Révocation de sanction' && + row.action !== 'Modification de mute' + ); - const { colors } = require('../../utils/constants'); + if (!sanctions.length) { + return interaction.editReply({ content: '✅ Tu n\'as aucune sanction sur ce serveur.' }); + } - // Découpe les sanctions en pages de 10 - const pages = []; - for (let i = 0; i < rows.length; i += 10) { - pages.push(rows.slice(i, i + 10)); - } + const pages = []; + for (let i = 0; i < sanctions.length; i += 10) { + pages.push(sanctions.slice(i, i + 10)); + } - const embeds = pages.map((page, pageIndex) => { - const embed = new EmbedBuilder() - .setTitle(`📋 Mes Sanctions - Page ${pageIndex + 1}/${pages.length}`) - .setColor(colors.warning) - .setThumbnail(interaction.user.displayAvatarURL({ dynamic: true })) - .setFooter({ text: `Total: ${rows.length} sanction(s)` }) - .setTimestamp(); + const embeds = pages.map((page, pageIndex) => { + const embed = new EmbedBuilder() + .setTitle(`📋 Mes Sanctions - Page ${pageIndex + 1}/${pages.length}`) + .setColor(colors.warning) + .setThumbnail(interaction.user.displayAvatarURL({ dynamic: true })) + .setFooter({ text: `Total: ${sanctions.length} sanction(s)` }) + .setTimestamp(); - page.forEach((row, index) => { - const date = ``; - const actionCapitalized = row.action.charAt(0).toUpperCase() + row.action.slice(1); + page.forEach((row, index) => { + const date = ``; + const actionCapitalized = row.action.charAt(0).toUpperCase() + row.action.slice(1); - embed.addFields({ - name: `#${index + 1 + pageIndex * 10} - ${actionCapitalized}`, - value: `**Modérateur:** <@${row.modId}> (${row.modTag || 'N/A'})\n` + - `**Raison:** ${row.reason || 'N/A'}\n` + - `**Date:** ${date}\n` + - `**Type:** ${row.type || 'N/A'}`, - inline: false - }); - }); + embed.addFields({ + name: `#${index + 1 + pageIndex * 10} - ${actionCapitalized}`, + value: `**Modérateur:** <@${row.modId}> (${row.modTag || 'N/A'})\n` + + `**Raison:** ${row.reason || 'N/A'}\n` + + `**Date:** ${date}\n` + + `**Type:** ${row.type || 'N/A'}`, + inline: false + }); + }); - return embed; - }); + return embed; + }); - // Si une seule page, pas besoin de boutons - if (pages.length === 1) { - return interaction.editReply({ embeds: [embeds[0]] }); - } + if (pages.length === 1) { + return interaction.editReply({ embeds: [embeds[0]] }); + } - // Sinon, ajouter les boutons de navigation - const { ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); - const row = new ActionRowBuilder().addComponents( - new ButtonBuilder().setCustomId('prev').setLabel('⬅️ Précédent').setStyle(ButtonStyle.Primary), - new ButtonBuilder().setCustomId('next').setLabel('Suivant ➡️').setStyle(ButtonStyle.Primary) - ); + const row = new ActionRowBuilder().addComponents( + new ButtonBuilder().setCustomId('prev').setLabel('⬅️ Précédent').setStyle(ButtonStyle.Primary), + new ButtonBuilder().setCustomId('next').setLabel('Suivant ➡️').setStyle(ButtonStyle.Primary) + ); - let currentPage = 0; - const message = await interaction.editReply({ embeds: [embeds[currentPage]], components: [row] }); + let currentPage = 0; + const message = await interaction.editReply({ embeds: [embeds[currentPage]], components: [row] }); - // Collecteur de boutons - const collector = message.createMessageComponentCollector({ time: 60_000 }); - collector.on('collect', async i => { - if (i.user.id !== interaction.user.id) { - return i.reply({ content: '❌ Ce n\'est pas ton menu !', ephemeral: true }); - } - if (i.customId === 'next') { - currentPage = (currentPage + 1) % embeds.length; - } - if (i.customId === 'prev') { - currentPage = (currentPage - 1 + embeds.length) % embeds.length; - } + const collector = message.createMessageComponentCollector({ time: 60_000 }); + collector.on('collect', async i => { + if (i.user.id !== interaction.user.id) { + return i.reply({ content: '❌ Ce n\'est pas ton menu !', flags: MessageFlags.Ephemeral }); + } + if (i.customId === 'next') { + currentPage = (currentPage + 1) % embeds.length; + } + if (i.customId === 'prev') { + currentPage = (currentPage - 1 + embeds.length) % embeds.length; + } - await i.update({ embeds: [embeds[currentPage]] }); - }); + await i.update({ embeds: [embeds[currentPage]] }); + }); - collector.on('end', () => { - message.edit({ components: [] }).catch(() => null); - }); - - } catch (err) { - console.error('Erreur lors de la récupération des sanctions:', err); - await interaction.editReply({ content: '❌ Une erreur est survenue lors de la récupération de tes sanctions.' }); - } - }, -}; + collector.on('end', () => { + message.edit({ components: [] }).catch(() => null); + }); + } catch (err) { + console.error('Erreur mysanctions:', err); + await interaction.editReply({ content: '❌ Une erreur est survenue lors de la récupération de tes sanctions.' }); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/purge.js b/commands/moderation/purge.js index 3c1808c..0d8c209 100644 --- a/commands/moderation/purge.js +++ b/commands/moderation/purge.js @@ -1,114 +1,103 @@ -const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder } = require('discord.js'); +const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); +const { sendLog } = require('../../utils/helpers'); +const { colors, emojis } = require('../../utils/constants'); module.exports = { - category: 'moderation', - data: new SlashCommandBuilder() - .setName('purge') - .setDescription('Supprimer les messages d\'un utilisateur dans un canal.') - .addUserOption(option => - option.setName('target') - .setDescription('L\'utilisateur dont supprimer les messages') - .setRequired(true)) - .addIntegerOption(option => - option.setName('amount') - .setDescription('Nombre de messages à vérifier (1-100)') - .setRequired(true) - .setMinValue(1) - .setMaxValue(100)) - .addStringOption(option => - option.setName('reason') - .setDescription('Raison de la purge') - .setRequired(false)) - .setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages), + category: 'moderation', + data: new SlashCommandBuilder() + .setName('purge') + .setDescription('Supprimer les messages d\'un utilisateur dans un canal.') + .addUserOption(option => + option.setName('target') + .setDescription('L\'utilisateur dont supprimer les messages') + .setRequired(true)) + .addIntegerOption(option => + option.setName('amount') + .setDescription('Nombre de messages à vérifier (1-100)') + .setRequired(true) + .setMinValue(1) + .setMaxValue(100)) + .addStringOption(option => + option.setName('reason') + .setDescription('Raison de la purge') + .setRequired(false)) + .setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages), - async execute(interaction) { - const target = interaction.options.getUser('target'); - const amount = interaction.options.getInteger('amount'); - const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; + async execute(interaction) { + const target = interaction.options.getUser('target'); + const amount = interaction.options.getInteger('amount'); + const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; - await interaction.deferReply({ ephemeral: true }); + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); - if (!interaction.channel.isTextBased()) { - return interaction.editReply({ content: '❌ Cette commande ne peut être utilisée que dans un canal texte.' }); - } + if (!interaction.channel.isTextBased()) { + return interaction.editReply({ content: '❌ Cette commande ne peut être utilisée que dans un canal texte.' }); + } - try { - const messages = await interaction.channel.messages.fetch({ limit: amount }); - const messagesToDelete = messages.filter(msg => msg.author.id === target.id); + try { + const messages = await interaction.channel.messages.fetch({ limit: amount }); + const messagesToDelete = messages.filter(msg => msg.author.id === target.id); - // Ne pas supprimer les messages de plus de 14 jours - const filteredMessages = messagesToDelete.filter(msg => { - const msgAge = Date.now() - msg.createdTimestamp; - return msgAge < 14 * 24 * 60 * 60 * 1000; - }); + const filteredMessages = messagesToDelete.filter(msg => { + const msgAge = Date.now() - msg.createdTimestamp; + return msgAge < 14 * 24 * 60 * 60 * 1000; + }); - if (filteredMessages.size === 0) { - return interaction.editReply({ content: `❌ Aucun message à supprimer de ${target.tag} (les messages de plus de 14 jours ne peuvent pas être supprimés).` }); - } + if (filteredMessages.size === 0) { + return interaction.editReply({ content: `❌ Aucun message à supprimer de ${target.tag} (les messages de plus de 14 jours ne peuvent pas être supprimés).` }); + } - await interaction.channel.bulkDelete(filteredMessages, true); + await interaction.channel.bulkDelete(filteredMessages, true); - // Log dans la DB - await db.query( - `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, - [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Purge', reason, null, interaction.guild.id, Date.now()] - ); + await db.query( + `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Purge', reason, null, interaction.guild.id, Date.now()] + ); - const { colors, emojis } = require('../../utils/constants'); - const { sendLog } = require('../../utils/helpers'); + const embed = new EmbedBuilder() + .setAuthor({ name: target.displayName, iconURL: target.displayAvatarURL({ dynamic: true }) }) + .setTitle(`${emojis.success} Messages Supprimés`) + .setColor(colors.success) + .setDescription(`**${filteredMessages.size}** message(s) de ${target.toString()} supprimé(s).`) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .addFields( + { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, + { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, + { name: '📊 Messages supprimés', value: `\`${filteredMessages.size}\``, inline: true }, + { name: '📝 Raison', value: reason, inline: false }, + { name: '📅 Date', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) + .setTimestamp(); - const embed = new EmbedBuilder() - .setAuthor({ - name: `${target.displayName}`, - iconURL: target.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.success} Messages Supprimés`) - .setColor(colors.success) - .setDescription(`**${filteredMessages.size}** message(s) de ${target.toString()} supprimé(s).`) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .addFields( - { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, - { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, - { name: '📊 Messages supprimés', value: `\`${filteredMessages.size}\``, inline: true }, - { name: '📝 Raison', value: reason, inline: false }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) - .setTimestamp(); + await interaction.editReply({ embeds: [embed] }); - await interaction.editReply({ embeds: [embed] }); - - // Log dans le canal de logs - const logEmbed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.user.displayName}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.success} Purge`) - .setColor(colors.success) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .setDescription(`**${filteredMessages.size}** message(s) de ${target.toString()} supprimé(s).`) - .addFields( - { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, - { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, - { name: '📊 Messages supprimés', value: `\`${filteredMessages.size}\``, inline: true }, - { name: '📝 Raison', value: reason, inline: false }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) - .setTimestamp(); - await sendLog(interaction.guild, { embeds: [logEmbed] }); - - } catch (err) { - console.error('Erreur lors de la purge:', err); - if (err.code === 50034) { - await interaction.editReply({ content: '❌ Les messages de plus de 14 jours ne peuvent pas être supprimés.' }); - } else { - await interaction.editReply({ content: `❌ Échec de la purge: ${err.message}` }); - } - } - }, -}; + const logEmbed = new EmbedBuilder() + .setAuthor({ name: interaction.user.displayName, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }) + .setTitle(`${emojis.success} Purge`) + .setColor(colors.success) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .setDescription(`**${filteredMessages.size}** message(s) de ${target.toString()} supprimé(s).`) + .addFields( + { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, + { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, + { name: '📊 Messages supprimés', value: `\`${filteredMessages.size}\``, inline: true }, + { name: '📝 Raison', value: reason, inline: false }, + { name: '📅 Date', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) + .setTimestamp(); + await sendLog(interaction.guild, { embeds: [logEmbed] }); + } catch (err) { + console.error('Erreur purge:', err); + if (err.code === 50034) { + await interaction.editReply({ content: '❌ Les messages de plus de 14 jours ne peuvent pas être supprimés.' }); + } else { + await interaction.editReply({ content: `❌ Échec de la purge: ${err.message}` }); + } + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/revokesanction.js b/commands/moderation/revokesanction.js index f3cecd9..f9a8bf3 100644 --- a/commands/moderation/revokesanction.js +++ b/commands/moderation/revokesanction.js @@ -1,109 +1,101 @@ -const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder } = require('discord.js'); +const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); +const { sendLog } = require('../../utils/helpers'); +const { colors, emojis } = require('../../utils/constants'); module.exports = { - category: 'moderation', - data: new SlashCommandBuilder() - .setName('revokesanction') - .setDescription('Révoquer une sanction (Haut gradés, Co-Fonda/Fonda uniquement).') - .addUserOption(option => - option.setName('user') - .setDescription('L\'utilisateur concerné') - .setRequired(true)) - .addIntegerOption(option => - option.setName('sanction_id') - .setDescription('L\'ID DB de la sanction à révoquer (visible dans /casier, ex: ID: 123)') - .setRequired(true)) - .addStringOption(option => - option.setName('reason') - .setDescription('Raison de la révocation') - .setRequired(false)) - .setDefaultMemberPermissions(PermissionFlagsBits.Administrator), - async execute(interaction) { - const target = interaction.options.getUser('user'); - const sanctionId = interaction.options.getInteger('sanction_id'); - const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; + category: 'moderation', + data: new SlashCommandBuilder() + .setName('revokesanction') + .setDescription('Révoquer une sanction (Haut gradés, Co-Fonda/Fonda uniquement).') + .addUserOption(option => + option.setName('user') + .setDescription('L\'utilisateur concerné') + .setRequired(true)) + .addIntegerOption(option => + option.setName('sanction_id') + .setDescription('L\'ID DB de la sanction à révoquer (visible dans /casier, ex: ID: 123)') + .setRequired(true)) + .addStringOption(option => + option.setName('reason') + .setDescription('Raison de la révocation') + .setRequired(false)) + .setDefaultMemberPermissions(PermissionFlagsBits.Administrator), + async execute(interaction) { + const target = interaction.options.getUser('user'); + const sanctionId = interaction.options.getInteger('sanction_id'); + const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; - await interaction.deferReply({ ephemeral: true }); + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); - // Vérifier les permissions (Administrateur ou propriétaire) - if (!interaction.member.permissions.has(PermissionFlagsBits.Administrator) && interaction.user.id !== interaction.guild.ownerId) { - return interaction.editReply({ content: '❌ Seuls les administrateurs et le propriétaire du serveur peuvent révoquer une sanction.' }); - } + if (!interaction.member.permissions.has(PermissionFlagsBits.Administrator) && interaction.user.id !== interaction.guild.ownerId) { + return interaction.editReply({ content: '❌ Seuls les administrateurs et le propriétaire du serveur peuvent révoquer une sanction.' }); + } - try { - // Récupérer directement la sanction par son ID DB (plus stable) - const [sanctionRows] = await db.query( - 'SELECT * FROM logs WHERE id = ? AND userId = ? AND guildId = ?', - [sanctionId, target.id, interaction.guild.id] - ); + try { + const [sanctionRows] = await db.query( + 'SELECT * FROM logs WHERE id = ? AND userId = ? AND guildId = ?', + [sanctionId, target.id, interaction.guild.id] + ); - if (!sanctionRows.length) { - return interaction.editReply({ - content: `❌ Aucune sanction trouvée avec l'ID ${sanctionId} pour ${target.tag}.\n\n💡 **Astuce:** Utilise l'ID DB visible dans \`/casier\` (ex: \`#1 (ID: 123)\` → utilise \`123\`).` - }); - } + if (!sanctionRows.length) { + return interaction.editReply({ + content: `❌ Aucune sanction trouvée avec l'ID ${sanctionId} pour ${target.tag}.\n\n💡 **Astuce:** Utilise l'ID DB visible dans \`/casier\` (ex: \`#1 (ID: 123)\` → utilise \`123\`).` + }); + } - const sanction = sanctionRows[0]; + const sanction = sanctionRows[0]; - // Vérifier que ce n'est pas une modification/révocation - if (sanction.action === 'Modification de sanction' || - sanction.action === 'Révocation de sanction' || - sanction.action === 'Modification de mute') { - return interaction.editReply({ content: `❌ Cette entrée est une modification, pas une sanction. Utilise l'ID d'une vraie sanction.` }); - } + if (sanction.action === 'Modification de sanction' || + sanction.action === 'Révocation de sanction' || + sanction.action === 'Modification de mute') { + return interaction.editReply({ content: `❌ Cette entrée est une modification, pas une sanction. Utilise l'ID d'une vraie sanction.` }); + } - // Marquer la sanction comme révoquée (on ne la supprime pas, on la marque) - await db.query( - 'UPDATE logs SET reason = CONCAT(reason, " [RÉVOQUÉE]") WHERE id = ?', - [sanction.id] - ); + await db.query( + 'UPDATE logs SET reason = CONCAT(reason, " [RÉVOQUÉE]") WHERE id = ?', + [sanction.id] + ); - // Log de la révocation - await db.query( - `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, - [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Révocation de sanction', `Sanction #${sanction.id} révoquée. Raison: ${reason}`, null, interaction.guild.id, Date.now()] - ); + await db.query( + `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Révocation de sanction', `Sanction #${sanction.id} révoquée. Raison: ${reason}`, null, interaction.guild.id, Date.now()] + ); - const { colors, emojis } = require('../../utils/constants'); - const { sendLog } = require('../../utils/helpers'); + const embed = new EmbedBuilder() + .setTitle(`${emojis.success} Sanction Révoquée`) + .setColor(colors.success) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .addFields( + { name: '👤 Utilisateur', value: `<@${target.id}> (${target.tag})`, inline: true }, + { name: '👑 Modérateur', value: `<@${interaction.user.id}> (${interaction.user.tag})`, inline: true }, + { name: '📝 Raison de révocation', value: reason, inline: false }, + { name: '🆔 ID Sanction révoquée', value: `${sanction.id}`, inline: true }, + { name: '📅 Date', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${target.id}` }) + .setTimestamp(); - const embed = new EmbedBuilder() - .setTitle(`${emojis.success} Sanction Révoquée`) - .setColor(colors.success) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .addFields( - { name: '👤 Utilisateur', value: `<@${target.id}> (${target.tag})`, inline: true }, - { name: '👑 Modérateur', value: `<@${interaction.user.id}> (${interaction.user.tag})`, inline: true }, - { name: '📝 Raison de révocation', value: reason, inline: false }, - { name: '🆔 ID Sanction révoquée', value: `${sanction.id}`, inline: true }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id}` }) - .setTimestamp(); + await interaction.editReply({ embeds: [embed] }); - await interaction.editReply({ embeds: [embed] }); - - // Log dans le canal de logs - const logEmbed = new EmbedBuilder() - .setTitle(`${emojis.success} Révocation de Sanction`) - .setColor(colors.success) - .addFields( - { name: '👤 Utilisateur', value: `<@${target.id}> (${target.tag})`, inline: true }, - { name: '👑 Modérateur', value: `<@${interaction.user.id}> (${interaction.user.tag})`, inline: true }, - { name: '📝 Raison de révocation', value: reason, inline: false }, - { name: '🆔 ID Sanction révoquée', value: `${sanction.id}`, inline: true }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id} | Serveur: ${interaction.guild.name}` }) - .setTimestamp(); - await sendLog(interaction.guild, { embeds: [logEmbed] }); - - } catch (err) { - console.error('Erreur lors de la révocation de la sanction:', err); - await interaction.editReply({ content: `❌ Échec de la révocation de la sanction: ${err.message}` }); - } - }, -}; + const logEmbed = new EmbedBuilder() + .setTitle(`${emojis.success} Révocation de Sanction`) + .setColor(colors.success) + .addFields( + { name: '👤 Utilisateur', value: `<@${target.id}> (${target.tag})`, inline: true }, + { name: '👑 Modérateur', value: `<@${interaction.user.id}> (${interaction.user.tag})`, inline: true }, + { name: '📝 Raison de révocation', value: reason, inline: false }, + { name: '🆔 ID Sanction révoquée', value: `${sanction.id}`, inline: true }, + { name: '📅 Date', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${target.id} | Serveur: ${interaction.guild.name}` }) + .setTimestamp(); + await sendLog(interaction.guild, { embeds: [logEmbed] }); + } catch (err) { + console.error('Erreur revokesanction:', err); + await interaction.editReply({ content: `❌ Échec de la révocation de la sanction: ${err.message}` }); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/unban.js b/commands/moderation/unban.js index d7a92ff..8422d2f 100644 --- a/commands/moderation/unban.js +++ b/commands/moderation/unban.js @@ -1,100 +1,80 @@ -const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits } = require('discord.js'); +const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); +const { sendLog } = require('../../utils/helpers'); +const { colors, emojis } = require('../../utils/constants'); module.exports = { - category: 'moderation', - data: new SlashCommandBuilder() - .setName('unban') - .setDescription('Débannir un utilisateur par son ID ou son tag.') - .addStringOption(option => - option.setName('user') - .setDescription('L\'ID ou le tag (Username#1234) de l\'utilisateur à débannir') - .setRequired(true)) - .setDefaultMemberPermissions(PermissionFlagsBits.BanMembers), + category: 'moderation', + data: new SlashCommandBuilder() + .setName('unban') + .setDescription('Débannir un utilisateur par son ID ou son tag.') + .addStringOption(option => + option.setName('user') + .setDescription('L\'ID ou le tag (Username#1234) de l\'utilisateur à débannir') + .setRequired(true)) + .setDefaultMemberPermissions(PermissionFlagsBits.BanMembers), - async execute(interaction) { - await interaction.deferReply(); + async execute(interaction) { + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); - const input = interaction.options.getString('user').trim(); + const input = interaction.options.getString('user').trim(); - try { - const bannedUsers = await interaction.guild.bans.fetch(); - const bannedUser = bannedUsers.find(b => - b.user.id === input || b.user.tag.toLowerCase() === input.toLowerCase() - ); + try { + const bannedUsers = await interaction.guild.bans.fetch(); + const bannedUser = bannedUsers.find(b => + b.user.id === input || b.user.tag.toLowerCase() === input.toLowerCase() + ); - if (!bannedUser) { - return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas banni.' }); - } + if (!bannedUser) return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas banni.' }); - // Récupération depuis MySQL - const [rows] = await db.query('SELECT * FROM bans WHERE userId = ? AND guildId = ?', [bannedUser.user.id, interaction.guild.id]); - const banRecord = rows[0]; + const reason = `Débanni par ${interaction.user.tag}`; + await interaction.guild.members.unban(bannedUser.user.id, reason); - const reason = `Débanni par ${interaction.user.tag}`; - await interaction.guild.members.unban(bannedUser.user.id, reason); + await db.query('DELETE FROM bans WHERE userId = ? AND guildId = ?', [bannedUser.user.id, interaction.guild.id]); - if (banRecord) { - await db.query('DELETE FROM bans WHERE userId = ? AND guildId = ?', [bannedUser.user.id, interaction.guild.id]); - } + const embed = new EmbedBuilder() + .setAuthor({ name: bannedUser.user.displayName, iconURL: bannedUser.user.displayAvatarURL({ dynamic: true }) }) + .setTitle(`${emojis.unban} Utilisateur Débanni`) + .setColor(colors.unban) + .setThumbnail(bannedUser.user.displayAvatarURL({ dynamic: true })) + .setDescription(`${bannedUser.user.toString()} a été débanni du serveur.`) + .addFields( + { name: '👤 Utilisateur', value: `${bannedUser.user.toString()}\n\`${bannedUser.user.tag}\``, inline: true }, + { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, + { name: '📝 Raison', value: reason, inline: false }, + { name: '📅 Date', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${bannedUser.user.id} • ${interaction.guild.name}` }) + .setTimestamp(); - const { colors, emojis } = require('../../utils/constants'); - const { sendLog } = require('../../utils/helpers'); + await interaction.editReply({ embeds: [embed] }); - const embed = new EmbedBuilder() - .setAuthor({ - name: `${bannedUser.user.displayName}`, - iconURL: bannedUser.user.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.unban} Utilisateur Débanni`) - .setColor(colors.unban) - .setThumbnail(bannedUser.user.displayAvatarURL({ dynamic: true })) - .setDescription(`${bannedUser.user.toString()} a été débanni du serveur.`) - .addFields( - { name: '👤 Utilisateur', value: `${bannedUser.user.toString()}\n\`${bannedUser.user.tag}\``, inline: true }, - { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, - { name: '📝 Raison', value: reason, inline: false }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${bannedUser.user.id} • ${interaction.guild.name}` }) - .setTimestamp(); + const logEmbed = new EmbedBuilder() + .setAuthor({ name: interaction.user.displayName, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }) + .setTitle(`${emojis.unban} Débannissement`) + .setColor(colors.unban) + .setThumbnail(bannedUser.user.displayAvatarURL({ dynamic: true })) + .setDescription(`${bannedUser.user.toString()} a été débanni du serveur.`) + .addFields( + { name: '👤 Utilisateur', value: `${bannedUser.user.toString()}\n\`${bannedUser.user.tag}\``, inline: true }, + { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, + { name: '📝 Raison', value: reason, inline: false }, + { name: '📅 Date', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${bannedUser.user.id} • ${interaction.guild.name}` }) + .setTimestamp(); + + await sendLog(interaction.guild, { embeds: [logEmbed] }); - await interaction.editReply({ embeds: [embed] }); + await db.query( + `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [bannedUser.user.id, bannedUser.user.tag, interaction.user.id, interaction.user.tag, 'Débannissement', reason, null, interaction.guild.id, Date.now()] + ); - // Log dans le canal de logs - const logEmbed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.user.displayName}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.unban} Débannissement`) - .setColor(colors.unban) - .setThumbnail(bannedUser.user.displayAvatarURL({ dynamic: true })) - .setDescription(`${bannedUser.user.toString()} a été débanni du serveur.`) - .addFields( - { name: '👤 Utilisateur', value: `${bannedUser.user.toString()}\n\`${bannedUser.user.tag}\``, inline: true }, - { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, - { name: '📝 Raison', value: reason, inline: false }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${bannedUser.user.id} • ${interaction.guild.name}` }) - .setTimestamp(); - await sendLog(interaction.guild, { embeds: [logEmbed] }); - - // Log dans la DB avec guildId - await db.query( - `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, - [bannedUser.user.id, bannedUser.user.tag, interaction.user.id, interaction.user.tag, 'Débannissement', reason, null, interaction.guild.id, Date.now()] - ); - - } catch (err) { - console.error('Erreur lors du débannissement:', err); - if (err.code === 50013) { - await interaction.editReply({ content: '❌ Je n\'ai pas les permissions nécessaires pour débannir cet utilisateur.' }); - } else { - await interaction.editReply({ content: '❌ Échec du débannissement de l\'utilisateur.' }); - } - } - }, -}; + } catch (err) { + console.error('Erreur unban:', err); + await interaction.editReply({ content: `❌ Erreur: ${err.message}` }); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/unmute.js b/commands/moderation/unmute.js index 8558056..6cb9b80 100644 --- a/commands/moderation/unmute.js +++ b/commands/moderation/unmute.js @@ -1,105 +1,86 @@ -const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder } = require('discord.js'); +const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); +const { sendLog } = require('../../utils/helpers'); +const { colors, emojis } = require('../../utils/constants'); module.exports = { - category: 'moderation', - data: new SlashCommandBuilder() - .setName('unmute') - .setDescription('Démuter un membre du serveur.') - .addUserOption(option => - option.setName('user') - .setDescription('Le membre à démuter') - .setRequired(true)) - .addStringOption(option => - option.setName('reason') - .setDescription('Raison du démute') - .setRequired(false)) - .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers), + category: 'moderation', + data: new SlashCommandBuilder() + .setName('unmute') + .setDescription('Démuter un membre du serveur.') + .addUserOption(option => + option.setName('user') + .setDescription('Le membre à démuter') + .setRequired(true)) + .addStringOption(option => + option.setName('reason') + .setDescription('Raison du démute') + .setRequired(false)) + .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers), - async execute(interaction) { - const target = interaction.options.getUser('user'); - const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; + async execute(interaction) { + const target = interaction.options.getUser('user'); + const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; - await interaction.deferReply({ ephemeral: true }); + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); - if (!target) { - return interaction.editReply({ content: '❌ Aucun utilisateur spécifié !' }); - } + if (!target) return interaction.editReply({ content: '❌ Aucun utilisateur spécifié !' }); - const member = await interaction.guild.members.fetch(target.id).catch(() => null); - if (!member) { - return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas sur le serveur.' }); - } + const member = await interaction.guild.members.fetch(target.id).catch(() => null); + if (!member) return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas sur le serveur.' }); - if (!member.communicationDisabledUntil) { - return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas muté.' }); - } + if (!member.communicationDisabledUntilTimestamp || member.communicationDisabledUntilTimestamp < Date.now()) { + return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas muté.' }); + } - try { - // Démuter - await member.timeout(null, `Démuté par ${interaction.user.tag}: ${reason}`); + try { + await member.timeout(null, `Démuté par ${interaction.user.tag}: ${reason}`); - // Supprimer de la DB - await db.query('DELETE FROM mutes WHERE userId = ? AND guildId = ?', [target.id, interaction.guild.id]); + await db.query('DELETE FROM mutes WHERE userId = ? AND guildId = ?', [target.id, interaction.guild.id]); - // Log dans la DB - await db.query( - `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, - [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Unmute', reason, null, interaction.guild.id, Date.now()] - ); + await db.query( + `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Unmute', reason, null, interaction.guild.id, Date.now()] + ); - const { colors, emojis } = require('../../utils/constants'); - const { sendLog } = require('../../utils/helpers'); + const embed = new EmbedBuilder() + .setAuthor({ name: target.displayName, iconURL: target.displayAvatarURL({ dynamic: true }) }) + .setTitle(`${emojis.unmute} Utilisateur Démuté`) + .setColor(colors.unmute) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .setDescription(`${target.toString()} a été démuté.`) + .addFields( + { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, + { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, + { name: '📝 Raison', value: reason, inline: false }, + { name: '📅 Date', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) + .setTimestamp(); - const embed = new EmbedBuilder() - .setAuthor({ - name: `${target.displayName}`, - iconURL: target.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.unmute} Utilisateur Démuté`) - .setColor(colors.unmute) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .setDescription(`${target.toString()} a été démuté.`) - .addFields( - { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, - { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, - { name: '📝 Raison', value: reason, inline: false }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) - .setTimestamp(); + await interaction.editReply({ embeds: [embed] }); - await interaction.editReply({ embeds: [embed] }); - - // Log dans le canal de logs - const logEmbed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.user.displayName}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.unmute} Unmute`) - .setColor(colors.unmute) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .setDescription(`${target.toString()} a été démuté.`) - .addFields( - { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, - { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, - { name: '📝 Raison', value: reason, inline: false }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) - .setTimestamp(); - await sendLog(interaction.guild, { embeds: [logEmbed] }); - - } catch (err) { - console.error('Erreur lors de l\'unmute:', err); - if (err.code === 50013) { - await interaction.editReply({ content: '❌ Je n\'ai pas les permissions nécessaires pour démuter cet utilisateur.' }); - } else { - await interaction.editReply({ content: `❌ Échec de l'unmute de ${target.tag}: ${err.message}` }); - } - } - }, -}; + const logEmbed = new EmbedBuilder() + .setAuthor({ name: interaction.user.displayName, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }) + .setTitle(`${emojis.unmute} Unmute`) + .setColor(colors.unmute) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .setDescription(`${target.toString()} a été démuté.`) + .addFields( + { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, + { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, + { name: '📝 Raison', value: reason, inline: false }, + { name: '📅 Date', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) + .setTimestamp(); + + await sendLog(interaction.guild, { embeds: [logEmbed] }); + } catch (err) { + console.error('Erreur unmute:', err); + await interaction.editReply({ content: `❌ Erreur: ${err.message}` }); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/untimeout.js b/commands/moderation/untimeout.js index 70c4e65..7cf0abe 100644 --- a/commands/moderation/untimeout.js +++ b/commands/moderation/untimeout.js @@ -1,90 +1,78 @@ -const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder } = require('discord.js'); +const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); +const { sendLog } = require('../../utils/helpers'); +const { colors, emojis } = require('../../utils/constants'); module.exports = { - category: 'moderation', - data: new SlashCommandBuilder() - .setName('untimeout') - .setDescription('Retirer le timeout d\'un membre.') - .addUserOption(option => - option.setName('target') - .setDescription('Le membre à dé-timeout') - .setRequired(true)) - .addStringOption(option => - option.setName('reason') - .setDescription('Raison de la levée du timeout') - .setRequired(false)) - .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers), + category: 'moderation', + data: new SlashCommandBuilder() + .setName('untimeout') + .setDescription('Retirer le timeout d\'un membre.') + .addUserOption(option => + option.setName('target') + .setDescription('Le membre à dé-timeout') + .setRequired(true)) + .addStringOption(option => + option.setName('reason') + .setDescription('Raison de la levée du timeout') + .setRequired(false)) + .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers), - async execute(interaction) { - const target = interaction.options.getUser('target'); - const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; + async execute(interaction) { + const target = interaction.options.getUser('target'); + const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; - await interaction.deferReply({ ephemeral: true }); + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); - if (!target) { - return interaction.editReply({ content: '❌ Aucun utilisateur spécifié !' }); - } + if (!target) return interaction.editReply({ content: '❌ Aucun utilisateur spécifié !' }); - const member = await interaction.guild.members.fetch(target.id).catch(() => null); - if (!member) { - return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas sur le serveur.' }); - } + const member = await interaction.guild.members.fetch(target.id).catch(() => null); + if (!member) return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas sur le serveur.' }); - if (!member.communicationDisabledUntil) { - return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas en timeout.' }); - } + if (!member.communicationDisabledUntilTimestamp || member.communicationDisabledUntilTimestamp < Date.now()) { + return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas en timeout.' }); + } - try { - await member.timeout(null, `Timeout retiré par ${interaction.user.tag}: ${reason}`); + try { + await member.timeout(null, `Timeout retiré par ${interaction.user.tag}: ${reason}`); - // Log dans la DB - await db.query( - `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, - [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Timeout retiré', reason, null, interaction.guild.id, Date.now()] - ); + await db.query( + `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Timeout retiré', reason, null, interaction.guild.id, Date.now()] + ); - const { colors, emojis } = require('../../utils/constants'); - const { sendLog } = require('../../utils/helpers'); + const embed = new EmbedBuilder() + .setTitle(`${emojis.success} Timeout Retiré`) + .setColor(colors.success) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .addFields( + { name: '👤 Utilisateur', value: `<@${target.id}> (${target.tag})`, inline: true }, + { name: '✅ Modérateur', value: `<@${interaction.user.id}> (${interaction.user.tag})`, inline: true }, + { name: '📝 Raison', value: reason, inline: false }, + { name: '📅 Date', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${target.id}` }) + .setTimestamp(); - const embed = new EmbedBuilder() - .setTitle(`${emojis.success} Timeout Retiré`) - .setColor(colors.success) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .addFields( - { name: '👤 Utilisateur', value: `<@${target.id}> (${target.tag})`, inline: true }, - { name: '✅ Modérateur', value: `<@${interaction.user.id}> (${interaction.user.tag})`, inline: true }, - { name: '📝 Raison', value: reason, inline: false }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id}` }) - .setTimestamp(); + await interaction.editReply({ embeds: [embed] }); - await interaction.editReply({ embeds: [embed] }); - - // Log dans le canal de logs - const logEmbed = new EmbedBuilder() - .setTitle(`${emojis.success} Timeout Retiré`) - .setColor(colors.success) - .addFields( - { name: '👤 Utilisateur', value: `<@${target.id}> (${target.tag})`, inline: true }, - { name: '✅ Modérateur', value: `<@${interaction.user.id}> (${interaction.user.tag})`, inline: true }, - { name: '📝 Raison', value: reason, inline: false }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id} | Serveur: ${interaction.guild.name}` }) - .setTimestamp(); - await sendLog(interaction.guild, { embeds: [logEmbed] }); - - } catch (err) { - console.error('Erreur lors de la levée du timeout:', err); - if (err.code === 50013) { - await interaction.editReply({ content: '❌ Je n\'ai pas les permissions nécessaires pour retirer le timeout de cet utilisateur.' }); - } else { - await interaction.editReply({ content: `❌ Échec de la levée du timeout de ${target.tag}: ${err.message}` }); - } - } - }, -}; + const logEmbed = new EmbedBuilder() + .setTitle(`${emojis.success} Timeout Retiré`) + .setColor(colors.success) + .addFields( + { name: '👤 Utilisateur', value: `<@${target.id}> (${target.tag})`, inline: true }, + { name: '✅ Modérateur', value: `<@${interaction.user.id}> (${interaction.user.tag})`, inline: true }, + { name: '📝 Raison', value: reason, inline: false }, + { name: '📅 Date', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${target.id} | Serveur: ${interaction.guild.name}` }) + .setTimestamp(); + await sendLog(interaction.guild, { embeds: [logEmbed] }); + } catch (err) { + console.error('Erreur untimeout:', err); + await interaction.editReply({ content: `❌ Erreur: ${err.message}` }); + } + }, +}; \ No newline at end of file diff --git a/commands/moderation/warn.js b/commands/moderation/warn.js index 3acb8fd..5c8689c 100644 --- a/commands/moderation/warn.js +++ b/commands/moderation/warn.js @@ -1,121 +1,101 @@ -const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder } = require('discord.js'); +const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); +const { sendLog } = require('../../utils/helpers'); +const { colors, emojis } = require('../../utils/constants'); module.exports = { - category: 'moderation', - data: new SlashCommandBuilder() - .setName('warn') - .setDescription('Avertir un membre.') - .addUserOption(option => - option.setName('target') - .setDescription('Le membre à avertir') - .setRequired(true)) - .addStringOption(option => - option.setName('reason') - .setDescription('Raison de l\'avertissement') - .setRequired(false)) - .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers), + category: 'moderation', + data: new SlashCommandBuilder() + .setName('warn') + .setDescription('Avertir un membre.') + .addUserOption(option => + option.setName('target') + .setDescription('Le membre à avertir') + .setRequired(true)) + .addStringOption(option => + option.setName('reason') + .setDescription('Raison de l\'avertissement') + .setRequired(false)) + .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers), - async execute(interaction) { - const target = interaction.options.getUser('target'); - const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; + async execute(interaction) { + const target = interaction.options.getUser('target'); + const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; - await interaction.deferReply(); + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); - if (!target) { - return interaction.editReply({ content: '❌ Aucun utilisateur spécifié !' }); - } + if (!target) return interaction.editReply({ content: '❌ Aucun utilisateur spécifié !' }); - const member = await interaction.guild.members.fetch(target.id).catch(() => null); - if (!member) { - return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas sur le serveur.' }); - } + const member = await interaction.guild.members.fetch(target.id).catch(() => null); + if (!member) return interaction.editReply({ content: '❌ Cet utilisateur n\'est pas sur le serveur.' }); - if (member.id === interaction.user.id) { - return interaction.editReply({ content: '❌ Tu ne peux pas t\'avertir toi-même.' }); - } + if (member.id === interaction.user.id) return interaction.editReply({ content: '❌ Tu ne peux pas t\'avertir toi-même.' }); - try { - // Compter les avertissements existants - const [warnRows] = await db.query( - 'SELECT COUNT(*) as count FROM logs WHERE userId = ? AND guildId = ? AND action = ?', - [target.id, interaction.guild.id, 'Avertissement'] - ); - const warnCount = warnRows[0].count + 1; + try { + const [warnRows] = await db.query( + 'SELECT COUNT(*) as count FROM logs WHERE userId = ? AND guildId = ? AND action = ?', + [target.id, interaction.guild.id, 'Avertissement'] + ); + const warnCount = warnRows[0].count + 1; - // Log dans la DB - await db.query( - `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, - [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Avertissement', reason, null, interaction.guild.id, Date.now()] - ); + await db.query( + `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [target.id, target.tag, interaction.user.id, interaction.user.tag, 'Avertissement', reason, null, interaction.guild.id, Date.now()] + ); - const { colors, emojis } = require('../../utils/constants'); - const { sendLog } = require('../../utils/helpers'); + const embed = new EmbedBuilder() + .setAuthor({ name: target.displayName, iconURL: target.displayAvatarURL({ dynamic: true }) }) + .setTitle(`${emojis.warn} Utilisateur Averti`) + .setColor(colors.warn) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .setDescription(`${target.toString()} a reçu un avertissement.`) + .addFields( + { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, + { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, + { name: '🔢 Nombre d\'avertissements', value: `\`${warnCount}\``, inline: true }, + { name: '📝 Raison', value: reason, inline: false }, + { name: '📅 Date', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) + .setTimestamp(); - const embed = new EmbedBuilder() - .setAuthor({ - name: `${target.displayName}`, - iconURL: target.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.warn} Utilisateur Averti`) - .setColor(colors.warn) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .setDescription(`${target.toString()} a reçu un avertissement.`) - .addFields( - { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, - { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, - { name: '🔢 Nombre d\'avertissements', value: `\`${warnCount}\``, inline: true }, - { name: '📝 Raison', value: reason, inline: false }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) - .setTimestamp(); + await interaction.editReply({ embeds: [embed] }); - await interaction.editReply({ embeds: [embed] }); + try { + const dmEmbed = new EmbedBuilder() + .setTitle(`${emojis.warn} Tu as reçu un avertissement`) + .setColor(colors.warn) + .setDescription(`Tu as été averti sur **${interaction.guild.name}**`) + .addFields( + { name: '📝 Raison', value: reason, inline: false }, + { name: '🔢 Nombre d\'avertissements', value: `${warnCount}`, inline: true } + ) + .setFooter({ text: interaction.guild.name, iconURL: interaction.guild.iconURL({ dynamic: true }) }) + .setTimestamp(); + await target.send({ embeds: [dmEmbed] }); + } catch { /* DMs fermés */ } - // Envoyer un message privé à l'utilisateur - try { - const dmEmbed = new EmbedBuilder() - .setTitle(`${emojis.warn} Tu as reçu un avertissement`) - .setColor(colors.warn) - .setDescription(`Tu as été averti sur **${interaction.guild.name}**`) - .addFields( - { name: '📝 Raison', value: reason, inline: false }, - { name: '🔢 Nombre d\'avertissements', value: `${warnCount}`, inline: true } - ) - .setFooter({ text: interaction.guild.name, iconURL: interaction.guild.iconURL({ dynamic: true }) }) - .setTimestamp(); - await target.send({ embeds: [dmEmbed] }); - } catch { - // L'utilisateur a les DMs fermés, on continue - } - - // Log dans le canal de logs - const logEmbed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.user.displayName}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.warn} Avertissement`) - .setColor(colors.warn) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .setDescription(`${target.toString()} a reçu un avertissement.`) - .addFields( - { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, - { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, - { name: '🔢 Nombre d\'avertissements', value: `\`${warnCount}\``, inline: true }, - { name: '📝 Raison', value: reason, inline: false }, - { name: '📅 Date', value: ``, inline: true } - ) - .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) - .setTimestamp(); - await sendLog(interaction.guild, { embeds: [logEmbed] }); - - } catch (err) { - console.error('Erreur lors de l\'avertissement:', err); - await interaction.editReply({ content: `❌ Échec de l'avertissement de ${target.tag}: ${err.message}` }); - } - }, -}; + const logEmbed = new EmbedBuilder() + .setAuthor({ name: interaction.user.displayName, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }) + .setTitle(`${emojis.warn} Avertissement`) + .setColor(colors.warn) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .setDescription(`${target.toString()} a reçu un avertissement.`) + .addFields( + { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, + { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, + { name: '🔢 Nombre d\'avertissements', value: `\`${warnCount}\``, inline: true }, + { name: '📝 Raison', value: reason, inline: false }, + { name: '📅 Date', value: ``, inline: true } + ) + .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) + .setTimestamp(); + await sendLog(interaction.guild, { embeds: [logEmbed] }); + } catch (err) { + console.error('Erreur warn:', err); + await interaction.editReply({ content: `❌ Erreur: ${err.message}` }); + } + }, +}; \ No newline at end of file diff --git a/commands/ticket/ticket.js b/commands/ticket/ticket.js index f416cf7..cba2818 100644 --- a/commands/ticket/ticket.js +++ b/commands/ticket/ticket.js @@ -1,70 +1,84 @@ -const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder, ChannelType, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); +const { + SlashCommandBuilder, + PermissionFlagsBits, + EmbedBuilder, + ChannelType, + ActionRowBuilder, + ButtonBuilder, + ButtonStyle, + ModalBuilder, + TextInputBuilder, + TextInputStyle, + MessageFlags +} = require('discord.js'); const db = require('../../functions/database/db.js'); -const { colors, emojis } = require('../../utils/constants'); +const { colors } = require('../../utils/constants'); +const fs = require('fs'); +const path = require('path'); // Questions pré-définies pour les candidatures const CANDIDATURE_QUESTIONS = [ - 'Pourquoi souhaites-tu rejoindre le staff ?', - 'Quelles sont tes disponibilités ?', - 'As-tu déjà de l\'expérience en modération ?', - 'Comment gérerais-tu un conflit entre membres ?', - 'Qu\'est-ce qui te motive à aider la communauté ?' + 'Pourquoi souhaites-tu rejoindre le staff ?', + 'Quelles sont tes disponibilités ?', + 'As-tu déjà de l\'expérience en modération ?', + 'Comment gérerais-tu un conflit entre membres ?', + 'Qu\'est-ce qui te motive à aider la communauté ?' ]; // Mapping des types de tickets vers des préfixes d'ID const TICKET_TYPE_PREFIXES = { - 'Support': 'SUPP', - 'Plainte': 'PLNT', - 'Plainte Staff': 'PLST', - 'Candidature': 'CAND', - 'Problème Technique': 'TECH' + 'Support': 'SUPP', + 'Plainte': 'PLNT', + 'Plainte Staff': 'PLST', + 'Candidature': 'CAND', + 'Problème Technique': 'TECH' }; function generateTicketId(type = 'Support') { - const prefix = TICKET_TYPE_PREFIXES[type] || 'TICK'; - const timestamp = Date.now().toString(36).toUpperCase(); - const random = Math.random().toString(36).substring(2, 6).toUpperCase(); - return `${prefix}-${timestamp}-${random}`; + const prefix = TICKET_TYPE_PREFIXES[type] || 'TICK'; + const timestamp = Date.now().toString(36).toUpperCase(); + const random = Math.random().toString(36).substring(2, 6).toUpperCase(); + return `${prefix}-${timestamp}-${random}`; } async function getCandidatureResponses(ticketId) { - const [responses] = await db.query( - 'SELECT * FROM candidature_responses WHERE ticketId = ? ORDER BY questionNumber ASC', - [ticketId] - ); - return responses; + const [responses] = await db.query( + 'SELECT * FROM candidature_responses WHERE ticketId = ? ORDER BY questionNumber ASC', + [ticketId] + ); + return responses; } function generateTranscriptHTML(ticket, messages, candidatureResponses, useRelativeCss = false) { - const date = new Date(ticket.createdAt); - const dateStr = date.toLocaleDateString('fr-FR', { year: 'numeric', month: '2-digit', day: '2-digit' }); - const closedDateStr = ticket.closedAt ? new Date(ticket.closedAt).toLocaleDateString('fr-FR', { year: 'numeric', month: '2-digit', day: '2-digit' }) : null; + const date = new Date(ticket.createdAt); + const dateStr = date.toLocaleDateString('fr-FR', { year: 'numeric', month: '2-digit', day: '2-digit' }); + const closedDateStr = ticket.closedAt ? new Date(ticket.closedAt).toLocaleDateString('fr-FR', { year: 'numeric', month: '2-digit', day: '2-digit' }) : null; - const typeEmojis = { - 'Support': '💬', - 'Plainte': '📢', - 'Plainte Staff': '⚠️', - 'Candidature': '📝', - 'Problème Technique': '🔧' - }; + const typeEmojis = { + 'Support': '💬', + 'Plainte': '📢', + 'Plainte Staff': '⚠️', + 'Candidature': '📝', + 'Problème Technique': '🔧' + }; - const statusColors = { - 'Ouvert': '#10b981', - 'Fermé': '#ef4444', - 'En attente': '#f59e0b' - }; + const statusColors = { + 'Ouvert': '#10b981', + 'Fermé': '#ef4444', + 'En attente': '#f59e0b' + }; - let messagesHTML = ''; - if (messages.length === 0) { - messagesHTML = '

Aucun message enregistré.

'; - } else { - messagesHTML = messages.map(msg => { - const msgDate = new Date(msg.timestamp).toLocaleString('fr-FR'); - const attachmentsHTML = msg.attachments - ? `
📎 Pièces jointes: ${msg.attachments.split(', ').map(url => `${url}`).join(', ')}
` - : ''; - - return ` + let messagesHTML = ''; + if (messages.length === 0) { + messagesHTML = '

Aucun message enregistré.

'; + } else { + messagesHTML = messages.map(msg => { + const msgDate = new Date(msg.timestamp).toLocaleString('fr-FR'); + const attachmentsHTML = msg.attachments + ? `
📎 Pièces jointes: ${msg.attachments.split(', ').map(url => `${url}`).join(', ')}
` + : ''; + + return `
${escapeHtml(msg.userTag)} @@ -74,12 +88,12 @@ function generateTranscriptHTML(ticket, messages, candidatureResponses, useRelat ${attachmentsHTML}
`; - }).join(''); - } + }).join(''); + } - let candidatureHTML = ''; - if (candidatureResponses && candidatureResponses.length > 0) { - candidatureHTML = ` + let candidatureHTML = ''; + if (candidatureResponses && candidatureResponses.length > 0) { + candidatureHTML = `

📝 Réponses aux Questions de Candidature

${candidatureResponses.map(response => ` @@ -91,20 +105,18 @@ function generateTranscriptHTML(ticket, messages, candidatureResponses, useRelat `).join('')}
`; - } + } - // Déterminer l'URL du CSS - let cssUrl; - if (useRelativeCss) { - // Utiliser un chemin relatif pour l'ouverture locale - cssUrl = '../../transcript.css'; - } else { - // Utiliser l'URL du serveur web - const webUrl = process.env.TRANSCRIPT_WEB_URL || 'transcript.syxpi.fr'; - cssUrl = `https://${webUrl}/static/transcript.css`; - } + // Déterminer l'URL du CSS + let cssUrl; + if (useRelativeCss) { + cssUrl = '../../transcript.css'; + } else { + const webUrl = process.env.TRANSCRIPT_WEB_URL || 'transcript.syxpi.fr'; + cssUrl = `https://${webUrl}/static/transcript.css`; + } - return ` + return ` @@ -159,7 +171,7 @@ function generateTranscriptHTML(ticket, messages, candidatureResponses, useRelat
@@ -167,1206 +179,495 @@ function generateTranscriptHTML(ticket, messages, candidatureResponses, useRelat } function escapeHtml(text) { - if (!text) return ''; - const map = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' - }; - return text.replace(/[&<>"']/g, m => map[m]); + if (!text) return ''; + const map = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; + return text.replace(/[&<>"']/g, m => map[m]); } const commandModule = { - category: 'ticket', - data: new SlashCommandBuilder() - .setName('ticket') - .setDescription('Gérer les tickets') - .addSubcommand(subcommand => - subcommand - .setName('setup') - .setDescription('Configurer le système de tickets (Admin uniquement)') - .addChannelOption(option => - option.setName('channel') - .setDescription('Le salon où afficher le message de création de tickets') - .setRequired(false))) - .addSubcommand(subcommand => - subcommand - .setName('close') - .setDescription('Fermer un ticket') - .addStringOption(option => - option.setName('reason') - .setDescription('Raison de la fermeture (optionnel)') - .setRequired(false))) - .addSubcommand(subcommand => - subcommand - .setName('transcript') - .setDescription('Générer la transcription d\'un ticket')) - .addSubcommand(subcommand => - subcommand - .setName('reopen') - .setDescription('Rouvrir un ticket fermé')) - .addSubcommand(subcommand => - subcommand - .setName('add') - .setDescription('Ajouter un utilisateur au ticket') - .addUserOption(option => - option.setName('user') - .setDescription('L\'utilisateur à ajouter au ticket') - .setRequired(true))) - .addSubcommand(subcommand => - subcommand - .setName('claim') - .setDescription('Réclamer un ticket (modérateurs uniquement)')), + category: 'ticket', + data: new SlashCommandBuilder() + .setName('ticket') + .setDescription('Gérer les tickets') + .addSubcommand(subcommand => subcommand.setName('setup').setDescription('Configurer (Admin)').addChannelOption(o => o.setName('channel').setDescription('Salon'))) + .addSubcommand(subcommand => subcommand.setName('close').setDescription('Fermer un ticket').addStringOption(o => o.setName('reason').setDescription('Raison'))) + .addSubcommand(subcommand => subcommand.setName('transcript').setDescription('Générer transcript')) + .addSubcommand(subcommand => subcommand.setName('reopen').setDescription('Rouvrir un ticket')) + .addSubcommand(subcommand => subcommand.setName('add').setDescription('Ajouter utilisateur').addUserOption(o => o.setName('user').setDescription('Utilisateur').setRequired(true))) + .addSubcommand(subcommand => subcommand.setName('claim').setDescription('Réclamer un ticket')), - async execute(interaction) { - const subcommand = interaction.options.getSubcommand(); - - if (subcommand === 'setup') { - await handleSetup(interaction); - } else if (subcommand === 'close') { - await handleClose(interaction); - } else if (subcommand === 'transcript') { - await handleTranscript(interaction); - } else if (subcommand === 'reopen') { - await handleReopen(interaction); - } else if (subcommand === 'add') { - await handleAdd(interaction); - } else if (subcommand === 'claim') { - await handleClaim(interaction); - } - }, + async execute(interaction) { + const subcommand = interaction.options.getSubcommand(); + if (subcommand === 'setup') await handleSetup(interaction); + else if (subcommand === 'close') await handleClose(interaction); + else if (subcommand === 'transcript') await handleTranscript(interaction); + else if (subcommand === 'reopen') await handleReopen(interaction); + else if (subcommand === 'add') await handleAdd(interaction); + else if (subcommand === 'claim') await handleClaim(interaction); + }, }; -async function handleSetup(interaction) { - await interaction.deferReply({ ephemeral: true }); - - // Vérifier les permissions (Admin uniquement) - if (!interaction.member.permissions.has(PermissionFlagsBits.Administrator)) { - return interaction.editReply({ - content: '❌ Tu n\'as pas la permission d\'utiliser cette commande. (Administrateur requis)' - }); - } - - const channel = interaction.options.getChannel('channel') || interaction.channel; - - if (!channel.isTextBased()) { - return interaction.editReply({ - content: '❌ Le salon doit être un canal texte.' - }); - } - - try { - // Créer l'embed avec les boutons - const embed = new EmbedBuilder() - .setTitle('🎫 Créer un Ticket') - .setColor(colors.primary) - .setDescription('Clique sur un des boutons ci-dessous pour créer un ticket.\n\n' + - '**💬 Support** - Pour toute question ou problème\n' + - '**📢 Plainte** - Pour signaler un problème avec un membre\n' + - '**⚠️ Plainte Staff** - Pour signaler un problème avec un staff\n' + - '**📝 Candidature** - Pour postuler au staff\n' + - '**🔧 Problème Technique** - Pour signaler un bug ou problème technique') - .setFooter({ text: 'France Femboy Bot • Système de Tickets' }) - .setTimestamp(); - - // Créer les boutons pour chaque type de ticket - const row = new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setCustomId('ticket_create_support') - .setLabel('Support') - .setStyle(ButtonStyle.Primary) - .setEmoji('💬'), - new ButtonBuilder() - .setCustomId('ticket_create_plainte') - .setLabel('Plainte') - .setStyle(ButtonStyle.Secondary) - .setEmoji('📢'), - new ButtonBuilder() - .setCustomId('ticket_create_plainte_staff') - .setLabel('Plainte Staff') - .setStyle(ButtonStyle.Danger) - .setEmoji('⚠️') - ); - - const row2 = new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setCustomId('ticket_create_candidature') - .setLabel('Candidature') - .setStyle(ButtonStyle.Success) - .setEmoji('📝'), - new ButtonBuilder() - .setCustomId('ticket_create_probleme_technique') - .setLabel('Problème Technique') - .setStyle(ButtonStyle.Secondary) - .setEmoji('🔧') - ); - - await channel.send({ embeds: [embed], components: [row, row2] }); - - await interaction.editReply({ - content: `✅ Message de création de tickets envoyé dans ${channel.toString()} !` - }); - - } catch (err) { - console.error('Erreur lors de la configuration du système de tickets:', err); - await interaction.editReply({ - content: `❌ Erreur lors de la configuration: ${err.message}` - }); - } -} - async function handleCreate(interaction, ticketType) { - await interaction.deferReply({ ephemeral: true }); + // Si l'interaction est un ModalSubmit, on a déjà répondu dans interactionCreate ? Non, on va defer ici. + // Attention : handleCreate est appelé après le ModalSubmit. + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); - // Mapping des customId vers les types - const typeMapping = { - 'ticket_create_support': 'Support', - 'ticket_create_plainte': 'Plainte', - 'ticket_create_plainte_staff': 'Plainte Staff', - 'ticket_create_candidature': 'Candidature', - 'ticket_create_probleme_technique': 'Problème Technique' - }; + const type = ticketType || 'Support'; - const type = ticketType || typeMapping[interaction.customId] || 'Support'; + // Récupérer le sujet s'il vient d'un modal + let subject = 'Aucun sujet précisé'; + if (interaction.isModalSubmit() && interaction.fields) { + try { + subject = interaction.fields.getTextInputValue('ticket_subject'); + } catch (e) { /* Pas de champ subject (ex: commande slash sans modal) */ } + } - try { - // Vérifier si l'utilisateur a déjà un ticket ouvert - const [existingTickets] = await db.query( - 'SELECT * FROM tickets WHERE userId = ? AND guildId = ? AND status = ?', - [interaction.user.id, interaction.guild.id, 'Ouvert'] - ); - - if (existingTickets.length > 0) { - const existingTicket = existingTickets[0]; - const channel = interaction.guild.channels.cache.get(existingTicket.channelId); - return interaction.editReply({ - content: `❌ Tu as déjà un ticket ouvert : ${channel ? channel.toString() : `ID: ${existingTicket.ticketId}`}` - }); - } - - // Trouver ou créer la catégorie pour les tickets - let ticketCategory = interaction.guild.channels.cache.find( - ch => ch.type === ChannelType.GuildCategory && ch.name.toLowerCase().includes('ticket') - ); - - if (!ticketCategory) { - // Créer la catégorie si elle n'existe pas - try { - ticketCategory = await interaction.guild.channels.create({ - name: '🎫 Tickets', - type: ChannelType.GuildCategory, - permissionOverwrites: [ - { - id: interaction.guild.id, - deny: [PermissionFlagsBits.ViewChannel], - }, - { - id: interaction.client.user.id, - allow: [ - PermissionFlagsBits.ViewChannel, - PermissionFlagsBits.ManageChannels, - PermissionFlagsBits.SendMessages, - PermissionFlagsBits.ReadMessageHistory, - ], - }, - ], - }); - } catch (err) { - console.error('Erreur lors de la création de la catégorie:', err); - // Si on ne peut pas créer la catégorie, on créera le canal sans parent - ticketCategory = null; - } - } else { - // Vérifier si le bot a les permissions nécessaires dans la catégorie existante - try { - const botMember = await interaction.guild.members.fetch(interaction.client.user.id); - const categoryPermissions = ticketCategory.permissionsFor(botMember); - - if (!categoryPermissions || !categoryPermissions.has([ - PermissionFlagsBits.ViewChannel, - PermissionFlagsBits.ManageChannels, - ])) { - // Essayer de donner les permissions au bot dans la catégorie - try { - await ticketCategory.permissionOverwrites.edit(interaction.client.user.id, { - ViewChannel: true, - ManageChannels: true, - SendMessages: true, - ReadMessageHistory: true, - }); - console.log('✅ Permissions données au bot dans la catégorie'); - } catch (permErr) { - console.warn('⚠️ Impossible de donner les permissions au bot dans la catégorie:', permErr.message); - // Si on ne peut pas donner les permissions, on créera le canal sans parent - ticketCategory = null; - } - } - } catch (err) { - console.warn('⚠️ Erreur lors de la vérification des permissions:', err.message); - // En cas d'erreur, on créera le canal sans parent - ticketCategory = null; - } - } - - // Générer un ID de ticket avec le préfixe du type - const ticketId = generateTicketId(type); - - // Nettoyer le nom d'utilisateur pour le nom du canal (Discord limite à 100 caractères, pas de caractères spéciaux) - const cleanUsername = interaction.user.username - .toLowerCase() - .replace(/[^a-z0-9-]/g, '') - .substring(0, 20); - - const typeName = type.toLowerCase().replace(/\s+/g, '-').substring(0, 20); - const channelName = `${typeName}-${cleanUsername}`.substring(0, 100); - - // Préparer les permissions pour le canal - const permissionOverwrites = [ - { - id: interaction.guild.id, - deny: [PermissionFlagsBits.ViewChannel], - }, - { - id: interaction.user.id, - allow: [ - PermissionFlagsBits.ViewChannel, - PermissionFlagsBits.SendMessages, - PermissionFlagsBits.ReadMessageHistory, - ], - }, - { - id: interaction.client.user.id, - allow: [ - PermissionFlagsBits.ViewChannel, - PermissionFlagsBits.SendMessages, - PermissionFlagsBits.ReadMessageHistory, - PermissionFlagsBits.EmbedLinks, - PermissionFlagsBits.AttachFiles, - PermissionFlagsBits.ManageMessages, - ], - }, - ]; - - // Créer le canal du ticket - let channel; - try { - // Essayer de créer le canal avec la catégorie - channel = await interaction.guild.channels.create({ - name: channelName, - type: ChannelType.GuildText, - parent: ticketCategory?.id, - permissionOverwrites: permissionOverwrites, - reason: `Ticket créé par ${interaction.user.tag} (${ticketId})`, - }); - - // Si le canal a été créé sans catégorie mais qu'on voulait une catégorie, essayer de le déplacer - if (ticketCategory && !channel.parentId) { - try { - await channel.setParent(ticketCategory.id, { reason: `Déplacement du ticket ${ticketId} dans la catégorie` }); - console.log(`✅ Canal ${channel.id} déplacé dans la catégorie ${ticketCategory.name}`); - } catch (moveErr) { - console.warn('⚠️ Impossible de déplacer le canal dans la catégorie:', moveErr.message); - } - } - } catch (createErr) { - // Si la création échoue avec la catégorie, essayer sans catégorie - if (ticketCategory && createErr.code === 50013) { - console.warn('⚠️ Impossible de créer le canal dans la catégorie, création sans catégorie...'); - try { - channel = await interaction.guild.channels.create({ - name: channelName, - type: ChannelType.GuildText, - permissionOverwrites: permissionOverwrites, - reason: `Ticket créé par ${interaction.user.tag} (${ticketId}) - Sans catégorie (permissions insuffisantes)`, - }); - console.log('✅ Canal créé sans catégorie'); - } catch (retryErr) { - console.error('❌ Erreur lors de la création du canal (sans catégorie):', retryErr); - throw retryErr; - } - } else { - throw createErr; - } - } - - // Ajouter les permissions pour les modérateurs (rôles avec ManageMessages) - const modRoles = interaction.guild.roles.cache.filter(role => - role.permissions.has(PermissionFlagsBits.ManageMessages) && - !role.managed // Exclure les rôles gérés par des bots - ); - - for (const role of modRoles.values()) { - await channel.permissionOverwrites.edit(role.id, { - ViewChannel: true, - SendMessages: true, - ReadMessageHistory: true, - }); - } - - // Enregistrer le ticket dans la DB - await db.query( - `INSERT INTO tickets (ticketId, channelId, userId, userTag, guildId, type, status, createdAt) - VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, - [ticketId, channel.id, interaction.user.id, interaction.user.tag, interaction.guild.id, type, 'Ouvert', Date.now()] - ); - - // Créer l'embed de bienvenue - const typeEmojis = { - 'Support': '💬', - 'Plainte': '📢', - 'Plainte Staff': '⚠️', - 'Candidature': '📝', - 'Problème Technique': '🔧' - }; - - const embed = new EmbedBuilder() - .setTitle(`${typeEmojis[type] || '🎫'} Ticket ${type} - ${ticketId}`) - .setColor(colors.primary) - .setDescription(`**Créé par:** <@${interaction.user.id}> (${interaction.user.tag})`) - .addFields( - { name: '📋 Instructions', value: 'Utilisez les boutons ci-dessous pour gérer ce ticket.\nLes modérateurs peuvent utiliser `/ticket transcript` pour générer la transcription.', inline: false } - ) - .setFooter({ text: `Ticket ID: ${ticketId}` }) - .setTimestamp(); - - // Boutons pour fermer et supprimer le ticket (uniquement pour modérateurs/admin) - const row = new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setCustomId(`ticket_close_${ticketId}`) - .setLabel('Fermer') - .setStyle(ButtonStyle.Danger) - .setEmoji('🔒'), - new ButtonBuilder() - .setCustomId(`ticket_delete_${ticketId}`) - .setLabel('Supprimer') - .setStyle(ButtonStyle.Danger) - .setEmoji('🗑️') - ); - - await channel.send({ embeds: [embed], components: [row] }); - - // Si c'est une candidature, ouvrir le modal dans le salon - if (type === 'Candidature') { - const { ModalBuilder, TextInputBuilder, TextInputStyle, ActionRowBuilder } = require('discord.js'); - const questions = require('./ticket.js').CANDIDATURE_QUESTIONS; - const modal = new ModalBuilder() - .setCustomId('candidature_modal') - .setTitle('Candidature Staff (5 max)'); - for(let i = 0; i < Math.min(questions.length,5); i++) { - const input = new TextInputBuilder() - .setCustomId(`cand_q${i+1}`) - .setLabel(questions[i].slice(0, 45)) - .setStyle(TextInputStyle.Paragraph) - .setRequired(true) - .setMaxLength(1000); - modal.addComponents(new ActionRowBuilder().addComponents(input)); - } - await interaction.showModal(modal); - return; - } - - await interaction.editReply({ - content: `✅ Ticket créé avec succès ! ${channel.toString()}` - }); - - } catch (err) { - console.error('Erreur lors de la création du ticket:', err); - await interaction.editReply({ - content: `❌ Erreur lors de la création du ticket: ${err.message}` - }); - } -} - -async function handleClose(interaction) { - await interaction.deferReply({ ephemeral: true }); - - // Récupérer la raison depuis les options (peut être null si appelé depuis un bouton) - let reason = 'Aucune raison fournie'; - if (interaction.options && typeof interaction.options.getString === 'function') { - reason = interaction.options.getString('reason') || 'Aucune raison fournie'; - } - - try { - // Trouver le ticket associé à ce canal - const [tickets] = await db.query( - 'SELECT * FROM tickets WHERE channelId = ?', - [interaction.channel.id] - ); - - if (tickets.length === 0) { - return interaction.editReply({ - content: '❌ Ce canal n\'est pas un ticket.' - }); - } - - const ticket = tickets[0]; - - if (ticket.status === 'Fermé') { - return interaction.editReply({ - content: '❌ Ce ticket est déjà fermé.' - }); - } - - // Vérifier les permissions (MODÉRATEURS/ADMIN UNIQUEMENT - les utilisateurs ne peuvent plus fermer) - if (!interaction.member.permissions.has(PermissionFlagsBits.ManageMessages) && - !interaction.member.permissions.has(PermissionFlagsBits.Administrator)) { - return interaction.editReply({ - content: '❌ Seuls les modérateurs et administrateurs peuvent fermer un ticket.' - }); - } - - // Mettre à jour le ticket - await db.query( - 'UPDATE tickets SET status = ?, closedAt = ?, closedBy = ? WHERE ticketId = ?', - ['Fermé', Date.now(), interaction.user.id, ticket.ticketId] - ); - - const embed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.user.displayName}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setTitle('🔒 Ticket Fermé') - .setColor(colors.warning) - .setDescription(`Ce ticket a été fermé.`) - .addFields( - { name: '👮 Fermé par', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, - { name: '📝 Raison', value: reason, inline: false } - ) - .setFooter({ text: `Ticket ID: ${ticket.ticketId} • ${interaction.guild.name}` }) - .setTimestamp(); - - await interaction.channel.send({ embeds: [embed] }); - - // Générer automatiquement le transcript - try { - // Récupérer tous les messages du ticket - const [messages] = await db.query( - 'SELECT * FROM ticket_messages WHERE ticketId = ? ORDER BY timestamp ASC', - [ticket.ticketId] - ); - - // Générer la transcription - let transcript = `# Transcription du Ticket ${ticket.ticketId}\n\n`; - transcript += `**Type:** ${ticket.type}\n`; - transcript += `**Créé par:** ${ticket.userTag} (${ticket.userId})\n`; - transcript += `**Créé le:** \n`; - if (ticket.closedAt) { - transcript += `**Fermé le:** \n`; - transcript += `**Fermé par:** ${ticket.closedBy ? `<@${ticket.closedBy}>` : 'N/A'}\n`; - } - transcript += `\n---\n\n`; - - if (messages.length === 0) { - transcript += '*Aucun message enregistré.*\n'; - } else { - for (const msg of messages) { - const date = new Date(msg.timestamp).toLocaleString('fr-FR'); - transcript += `**[${date}] ${msg.userTag}:**\n${msg.content || '*Message vide*'}\n`; - if (msg.attachments) { - transcript += `*Pièces jointes: ${msg.attachments}*\n`; - } - transcript += `\n`; - } - } - - // Générer le fichier HTML - const fs = require('fs'); - const path = require('path'); - - // Organiser par type et date - const date = new Date(ticket.createdAt); - const dateFolder = date.toISOString().split('T')[0]; - const typeFolder = ticket.type.toLowerCase().replace(/\s+/g, '-'); - const cleanUsername = ticket.userTag.replace(/[^a-zA-Z0-9-_]/g, '-').toLowerCase(); - - const transcriptsBaseDir = path.join(process.cwd(), 'transcripts'); - const typeDir = path.join(transcriptsBaseDir, typeFolder); - const dateDir = path.join(typeDir, dateFolder); - - // Créer les dossiers si nécessaire - if (!fs.existsSync(transcriptsBaseDir)) { - fs.mkdirSync(transcriptsBaseDir, { recursive: true }); - } - if (!fs.existsSync(typeDir)) { - fs.mkdirSync(typeDir, { recursive: true }); - } - if (!fs.existsSync(dateDir)) { - fs.mkdirSync(dateDir, { recursive: true }); - } - - // Copier le CSS dans le dossier transcripts pour l'ouverture locale - const cssSourcePath = path.join(__dirname, '../../server/public/transcript.css'); - const cssDestPath = path.join(transcriptsBaseDir, 'transcript.css'); - if (fs.existsSync(cssSourcePath) && !fs.existsSync(cssDestPath)) { - fs.copyFileSync(cssSourcePath, cssDestPath); - } - - const candidatureResponses = ticket.type === 'Candidature' ? await getCandidatureResponses(ticket.ticketId) : null; - const htmlContent = generateTranscriptHTML(ticket, messages, candidatureResponses, true); - - // Nom du fichier - const fileName = `${dateFolder}-${cleanUsername}.html`; - const filePath = path.join(dateDir, fileName); - - // Sauvegarder le fichier HTML - fs.writeFileSync(filePath, htmlContent, 'utf8'); - - // Sauvegarder le chemin web dans la DB (utiliser transcripts/ pour correspondre au dossier réel) - const webPath = `transcripts/${typeFolder}/${dateFolder}/${fileName}`; - await db.query( - 'UPDATE tickets SET transcript = ?, transcriptPath = ? WHERE ticketId = ?', - [transcript, webPath, ticket.ticketId] - ); - - console.log(`✅ Transcript généré automatiquement pour le ticket ${ticket.ticketId}`); - } catch (transcriptErr) { - console.error('⚠️ Erreur lors de la génération automatique du transcript:', transcriptErr); - // On continue même si le transcript échoue - } - - // Supprimer les permissions de l'utilisateur - await interaction.channel.permissionOverwrites.edit(ticket.userId, { - ViewChannel: false, - }); - - // Renommer le canal avec le préfixe "🔒-" si ce n'est pas déjà fait - try { - const currentName = interaction.channel.name; - if (!currentName.startsWith('🔒-')) { - await interaction.channel.setName(`🔒-${currentName}`); - } - } catch (renameErr) { - console.error('⚠️ Erreur lors du renommage du canal:', renameErr); - // On continue même si le renommage échoue - } - - await interaction.editReply({ - content: '✅ Ticket fermé avec succès. Le transcript a été généré automatiquement.' - }); - - } catch (err) { - console.error('Erreur lors de la fermeture du ticket:', err); - await interaction.editReply({ - content: `❌ Erreur lors de la fermeture du ticket: ${err.message}` - }); - } -} - -async function handleTranscript(interaction) { - await interaction.deferReply({ ephemeral: true }); - - try { - // Trouver le ticket - const [tickets] = await db.query( - 'SELECT * FROM tickets WHERE channelId = ?', - [interaction.channel.id] - ); - - if (tickets.length === 0) { - return interaction.editReply({ - content: '❌ Ce canal n\'est pas un ticket.' - }); - } - - const ticket = tickets[0]; - - // Récupérer tous les messages du ticket - const [messages] = await db.query( - 'SELECT * FROM ticket_messages WHERE ticketId = ? ORDER BY timestamp ASC', - [ticket.ticketId] - ); - - // Générer la transcription - let transcript = `# Transcription du Ticket ${ticket.ticketId}\n\n`; - transcript += `**Type:** ${ticket.type}\n`; - transcript += `**Créé par:** ${ticket.userTag} (${ticket.userId})\n`; - transcript += `**Créé le:** \n`; - if (ticket.closedAt) { - transcript += `**Fermé le:** \n`; - transcript += `**Fermé par:** ${ticket.closedBy ? `<@${ticket.closedBy}>` : 'N/A'}\n`; - } - transcript += `\n---\n\n`; - - if (messages.length === 0) { - transcript += '*Aucun message enregistré.*\n'; - } else { - for (const msg of messages) { - const date = new Date(msg.timestamp).toLocaleString('fr-FR'); - transcript += `**[${date}] ${msg.userTag}:**\n${msg.content || '*Message vide*'}\n`; - if (msg.attachments) { - transcript += `*Pièces jointes: ${msg.attachments}*\n`; - } - transcript += `\n`; - } - } - - // Les réponses de candidature seront incluses dans le HTML - - // Sauvegarder la transcription dans la DB - await db.query( - 'UPDATE tickets SET transcript = ? WHERE ticketId = ?', - [transcript, ticket.ticketId] - ); - - // Générer le fichier HTML - const fs = require('fs'); - const path = require('path'); - - // Organiser par type et date (ex: transcripts/Support/2025-11-08/) - const date = new Date(ticket.createdAt); - const dateFolder = date.toISOString().split('T')[0]; // Format: YYYY-MM-DD - const typeFolder = ticket.type.toLowerCase().replace(/\s+/g, '-'); // Format: support, plainte-staff, etc. - const cleanUsername = ticket.userTag.replace(/[^a-zA-Z0-9-_]/g, '-').toLowerCase(); - - const transcriptsBaseDir = path.join(process.cwd(), 'transcripts'); - const typeDir = path.join(transcriptsBaseDir, typeFolder); - const dateDir = path.join(typeDir, dateFolder); - - // Créer les dossiers si nécessaire - if (!fs.existsSync(transcriptsBaseDir)) { - fs.mkdirSync(transcriptsBaseDir, { recursive: true }); - } - if (!fs.existsSync(typeDir)) { - fs.mkdirSync(typeDir, { recursive: true }); - } - if (!fs.existsSync(dateDir)) { - fs.mkdirSync(dateDir, { recursive: true }); - } - - // Copier le CSS dans le dossier transcripts pour l'ouverture locale - const cssSourcePath = path.join(__dirname, '../../server/public/transcript.css'); - const cssDestPath = path.join(transcriptsBaseDir, 'transcript.css'); - if (fs.existsSync(cssSourcePath) && !fs.existsSync(cssDestPath)) { - fs.copyFileSync(cssSourcePath, cssDestPath); - } - - // Générer le HTML - const htmlContent = generateTranscriptHTML(ticket, messages, ticket.type === 'Candidature' ? await getCandidatureResponses(ticket.ticketId) : null, true); - - // Nom de fichier : date-username.html (ex: 2025-11-08-syxpi.html) - const fileName = `${dateFolder}-${cleanUsername}.html`; - const filePath = path.join(dateDir, fileName); - - // Sauvegarder le chemin relatif dans la DB pour accès web (utiliser transcripts/ pour correspondre au dossier réel) - const webPath = `transcripts/${typeFolder}/${dateFolder}/${fileName}`; - await db.query( - 'UPDATE tickets SET transcript = ?, transcriptPath = ? WHERE ticketId = ?', - [transcript, webPath, ticket.ticketId] - ); - - fs.writeFileSync(filePath, htmlContent, 'utf8'); - - // Envoyer le fichier avec info sur le chemin web - const webUrl = process.env.TRANSCRIPT_WEB_URL || 'transcript.syxpi.fr'; - const fullWebPath = `https://${webUrl}/${webPath}`; - - await interaction.editReply({ - content: `✅ Transcription générée !\n\n📄 **Fichier local:** \`${fileName}\`\n🌐 **URL web:** ${fullWebPath}\n\n*Note: L'URL web nécessite une authentification Discord.*`, - files: [{ - attachment: filePath, - name: fileName - }] - }); - - } catch (err) { - console.error('Erreur lors de la génération de la transcription:', err); - await interaction.editReply({ - content: `❌ Erreur lors de la génération de la transcription: ${err.message}` - }); - } -} - -async function handleReopen(interaction) { - await interaction.deferReply({ ephemeral: true }); - - // Vérifier les permissions - if (!interaction.member.permissions.has(PermissionFlagsBits.ManageMessages)) { - return interaction.editReply({ - content: '❌ Tu n\'as pas la permission de rouvrir un ticket.' - }); - } - - try { - const [tickets] = await db.query( - 'SELECT * FROM tickets WHERE channelId = ?', - [interaction.channel.id] - ); - - if (tickets.length === 0) { - return interaction.editReply({ - content: '❌ Ce canal n\'est pas un ticket.' - }); - } - - const ticket = tickets[0]; - - if (ticket.status !== 'Fermé') { - return interaction.editReply({ - content: '❌ Ce ticket n\'est pas fermé.' - }); - } - - // Rouvrir le ticket - await db.query( - 'UPDATE tickets SET status = ?, closedAt = NULL, closedBy = NULL WHERE ticketId = ?', - ['Ouvert', ticket.ticketId] - ); - - // Restaurer les permissions - await interaction.channel.permissionOverwrites.edit(ticket.userId, { - ViewChannel: true, - SendMessages: true, - ReadMessageHistory: true, - }); - - // Retirer le préfixe "🔒-" du nom du canal si présent - try { - const currentName = interaction.channel.name; - if (currentName.startsWith('🔒-')) { - await interaction.channel.setName(currentName.replace('🔒-', '')); - } - } catch (renameErr) { - console.error('⚠️ Erreur lors du renommage du canal:', renameErr); - // On continue même si le renommage échoue - } - - const embed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.user.displayName}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setTitle('🔓 Ticket Rouvert') - .setColor(colors.success) - .setDescription(`Ce ticket a été rouvert.`) - .addFields( - { name: '👮 Rouvert par', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true } - ) - .setFooter({ text: `Ticket ID: ${ticket.ticketId} • ${interaction.guild.name}` }) - .setTimestamp(); - - await interaction.channel.send({ embeds: [embed] }); - - await interaction.editReply({ - content: '✅ Ticket rouvert avec succès.' - }); - - } catch (err) { - console.error('Erreur lors de la réouverture du ticket:', err); - await interaction.editReply({ - content: `❌ Erreur lors de la réouverture du ticket: ${err.message}` - }); - } -} - -async function handleAdd(interaction) { - await interaction.deferReply({ ephemeral: true }); - - try { - // Trouver le ticket associé à ce canal - const [tickets] = await db.query( - 'SELECT * FROM tickets WHERE channelId = ?', - [interaction.channel.id] - ); - - if (tickets.length === 0) { - return interaction.editReply({ - content: '❌ Ce canal n\'est pas un ticket.' - }); - } - - const ticket = tickets[0]; - - // Vérifier que le ticket n'est pas fermé - if (ticket.status === 'Fermé' || ticket.status === 'Supprimé') { - return interaction.editReply({ - content: '❌ Vous ne pouvez pas ajouter un utilisateur à un ticket fermé ou supprimé.' - }); - } - - // Récupérer l'utilisateur à ajouter - const userToAdd = interaction.options.getUser('user'); - - if (!userToAdd) { - return interaction.editReply({ - content: '❌ Utilisateur introuvable.' - }); - } - - // Vérifier que l'utilisateur n'est pas un bot (optionnel, mais recommandé) - if (userToAdd.bot) { - return interaction.editReply({ - content: '❌ Vous ne pouvez pas ajouter un bot au ticket.' - }); - } - - // Vérifier que l'utilisateur n'est pas déjà dans le ticket - const member = await interaction.guild.members.fetch(userToAdd.id).catch(() => null); - if (!member) { - return interaction.editReply({ - content: '❌ Cet utilisateur n\'est pas sur le serveur.' - }); - } - - // Vérifier si l'utilisateur a déjà accès au canal - try { - const channelPermissions = interaction.channel.permissionsFor(member); - if (channelPermissions && channelPermissions.has(PermissionFlagsBits.ViewChannel)) { - return interaction.editReply({ - content: `❌ ${userToAdd.toString()} a déjà accès à ce ticket.` - }); - } - } catch (permErr) { - // Si on ne peut pas vérifier les permissions, on continue quand même - console.warn('⚠️ Erreur lors de la vérification des permissions:', permErr); - } - - // Ajouter les permissions pour l'utilisateur - await interaction.channel.permissionOverwrites.edit(userToAdd.id, { - ViewChannel: true, - SendMessages: true, - ReadMessageHistory: true, - }); - - const embed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.user.displayName}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setTitle('✅ Utilisateur Ajouté') - .setColor(colors.success) - .setDescription(`${userToAdd.toString()} a été ajouté au ticket.`) - .setThumbnail(userToAdd.displayAvatarURL({ dynamic: true })) - .addFields( - { name: '👤 Utilisateur ajouté', value: `${userToAdd.toString()}\n\`${userToAdd.tag}\``, inline: true }, - { name: '👮 Ajouté par', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true } - ) - .setFooter({ text: `Ticket ID: ${ticket.ticketId} • ${interaction.guild.name}` }) - .setTimestamp(); - - await interaction.channel.send({ embeds: [embed] }); - - await interaction.editReply({ - content: `✅ ${userToAdd.toString()} a été ajouté au ticket avec succès.` - }); - - } catch (err) { - console.error('Erreur lors de l\'ajout d\'un utilisateur au ticket:', err); - if (err.code === 50013) { - await interaction.editReply({ - content: '❌ Je n\'ai pas les permissions nécessaires pour ajouter cet utilisateur au ticket.' - }); - } else { - await interaction.editReply({ - content: `❌ Erreur lors de l'ajout de l'utilisateur: ${err.message}` - }); - } - } -} - -async function handleClaim(interaction) { - await interaction.deferReply({ ephemeral: true }); - - // Vérifier les permissions (MODÉRATEURS/ADMIN UNIQUEMENT) - if (!interaction.member.permissions.has(PermissionFlagsBits.ManageMessages) && - !interaction.member.permissions.has(PermissionFlagsBits.Administrator)) { - return interaction.editReply({ - content: '❌ Seuls les modérateurs et administrateurs peuvent réclamer un ticket.' - }); - } - - try { - // Trouver le ticket associé à ce canal - const [tickets] = await db.query( - 'SELECT * FROM tickets WHERE channelId = ?', - [interaction.channel.id] - ); - - if (tickets.length === 0) { - return interaction.editReply({ - content: '❌ Ce canal n\'est pas un ticket.' - }); - } - - const ticket = tickets[0]; - - // Vérifier que le ticket n'est pas fermé ou supprimé - if (ticket.status === 'Fermé' || ticket.status === 'Supprimé') { - return interaction.editReply({ - content: '❌ Vous ne pouvez pas réclamer un ticket fermé ou supprimé.' - }); - } - - // Vérifier si le ticket est déjà claim - if (ticket.claimedBy && ticket.claimedBy !== interaction.user.id) { - const claimedByUser = await interaction.client.users.fetch(ticket.claimedBy).catch(() => null); - return interaction.editReply({ - content: `❌ Ce ticket est déjà réclamé par ${claimedByUser ? claimedByUser.toString() : 'un autre modérateur'}.` - }); - } - - // Si l'utilisateur a déjà claim le ticket, lui permettre de le "unclaim" - if (ticket.claimedBy === interaction.user.id) { - await db.query( - 'UPDATE tickets SET claimedBy = NULL, claimedAt = NULL, claimedByTag = NULL WHERE ticketId = ?', - [ticket.ticketId] - ); - - const embed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.user.displayName}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setTitle('✅ Ticket Non Réclamé') - .setColor(colors.info) - .setDescription(`Vous avez libéré ce ticket.`) - .setFooter({ text: `Ticket ID: ${ticket.ticketId} • ${interaction.guild.name}` }) - .setTimestamp(); - - await interaction.channel.send({ embeds: [embed] }); - - return interaction.editReply({ - content: '✅ Ticket libéré avec succès.' - }); - } - - // Claim le ticket (on stocke aussi le tag du modérateur pour l'affichage dans la WebUI) - await db.query( - 'UPDATE tickets SET claimedBy = ?, claimedAt = ?, claimedByTag = ? WHERE ticketId = ?', - [interaction.user.id, Date.now(), interaction.user.tag, ticket.ticketId] - ); - - const embed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.user.displayName}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setTitle('✅ Ticket Réclamé') - .setColor(colors.success) - .setDescription(`Ce ticket a été réclamé par ${interaction.user.toString()}.`) - .addFields( - { name: '👮 Réclamé par', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true } - ) - .setFooter({ text: `Ticket ID: ${ticket.ticketId} • ${interaction.guild.name}` }) - .setTimestamp(); - - await interaction.channel.send({ embeds: [embed] }); - - await interaction.editReply({ - content: '✅ Ticket réclamé avec succès.' - }); - - } catch (err) { - console.error('Erreur lors de la réclamation du ticket:', err); - await interaction.editReply({ - content: `❌ Erreur lors de la réclamation du ticket: ${err.message}` - }); - } -} - -async function handleDelete(interaction) { - await interaction.deferReply({ ephemeral: true }); - - try { - // Trouver le ticket associé à ce canal - const [tickets] = await db.query( - 'SELECT * FROM tickets WHERE channelId = ?', - [interaction.channel.id] - ); - - if (tickets.length === 0) { - return interaction.editReply({ - content: '❌ Ce canal n\'est pas un ticket.' - }); - } - - const ticket = tickets[0]; - - // Vérifier les permissions (MODÉRATEURS/ADMIN UNIQUEMENT) - if (!interaction.member.permissions.has(PermissionFlagsBits.ManageMessages) && - !interaction.member.permissions.has(PermissionFlagsBits.Administrator)) { - return interaction.editReply({ - content: '❌ Seuls les modérateurs et administrateurs peuvent supprimer un ticket.' - }); - } - - // Générer le transcript avant de supprimer (si pas déjà fait) - if (ticket.status !== 'Fermé') { - try { - // Générer le transcript avant suppression - const [messages] = await db.query( - 'SELECT * FROM ticket_messages WHERE ticketId = ? ORDER BY timestamp ASC', - [ticket.ticketId] - ); - - const fs = require('fs'); - const path = require('path'); - - const date = new Date(ticket.createdAt); - const dateFolder = date.toISOString().split('T')[0]; - const typeFolder = ticket.type.toLowerCase().replace(/\s+/g, '-'); - const cleanUsername = ticket.userTag.replace(/[^a-zA-Z0-9-_]/g, '-').toLowerCase(); - - const transcriptsBaseDir = path.join(process.cwd(), 'transcripts'); - const typeDir = path.join(transcriptsBaseDir, typeFolder); - const dateDir = path.join(typeDir, dateFolder); - - if (!fs.existsSync(dateDir)) { - fs.mkdirSync(dateDir, { recursive: true }); - } - - const candidatureResponses = ticket.type === 'Candidature' ? await getCandidatureResponses(ticket.ticketId) : null; - const htmlContent = generateTranscriptHTML({ ...ticket, status: 'Fermé', closedAt: Date.now(), closedBy: interaction.user.id }, messages, candidatureResponses, true); - - const fileName = `${dateFolder}-${cleanUsername}.html`; - const filePath = path.join(dateDir, fileName); - fs.writeFileSync(filePath, htmlContent, 'utf8'); - - const webPath = `transcripts/${typeFolder}/${dateFolder}/${fileName}`; - await db.query( - 'UPDATE tickets SET transcriptPath = ?, status = ?, closedAt = ?, closedBy = ? WHERE ticketId = ?', - [webPath, 'Fermé', Date.now(), interaction.user.id, ticket.ticketId] - ); - } catch (transcriptErr) { - console.error('⚠️ Erreur lors de la génération du transcript avant suppression:', transcriptErr); - } - } - - // Supprimer le canal - await interaction.channel.delete(`Ticket supprimé par ${interaction.user.tag}`); - - // Mettre à jour le ticket dans la DB (marquer comme supprimé) -await db.query( - 'UPDATE tickets SET status = ?, closedAt = ?, closedBy = ? WHERE ticketId = ?', - ['Supprimé', Date.now(), interaction.user.id, ticket.ticketId] - ); // (Assure-toi que la valeur Supprimé est autorisée dans ENUM) - - // Note: On ne peut pas envoyer de réponse car le canal est supprimé - // L'utilisateur verra la réponse ephemeral avant la suppression - - } catch (err) { - console.error('Erreur lors de la suppression du ticket:', err); - if (err.code === 50013) { - await interaction.editReply({ - content: '❌ Je n\'ai pas les permissions nécessaires pour supprimer ce canal.' - }); - } else { - await interaction.editReply({ - content: `❌ Erreur lors de la suppression du ticket: ${err.message}` - }); - } - } -} - -// Exporter handleCreate, handleClose et handleDelete pour l'utiliser dans interactionCreate -commandModule.handleCreate = handleCreate; -commandModule.handleClose = handleClose; -commandModule.handleDelete = handleDelete; -module.exports.CANDIDATURE_QUESTIONS = CANDIDATURE_QUESTIONS; -module.exports.generateTicketId = generateTicketId; -// Handler pour la soumission du modal de candidature -commandModule.handleCandidatureModalSubmit = async function(interaction) { - const db = require('../../functions/database/db.js'); - // Pas de require/référence module ici, tout est local dans ce fichier ! - const { EmbedBuilder, ChannelType, PermissionFlagsBits, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); try { - // Générer ticketId, permissions, etc - const ticketId = generateTicketId('Candidature'); - const cleanUsername = interaction.user.username.toLowerCase().replace(/[^a-z0-9-]/g, '').substring(0, 20); - const channelName = `candidature-${cleanUsername}`.substring(0, 100); - const permissionOverwrites = [ - { - id: interaction.guild.id, - deny: [PermissionFlagsBits.ViewChannel], - }, - { - id: interaction.user.id, - allow: [ - PermissionFlagsBits.ViewChannel, - PermissionFlagsBits.SendMessages, - PermissionFlagsBits.ReadMessageHistory, - ], - }, - { - id: interaction.client.user.id, - allow: [ - PermissionFlagsBits.ViewChannel, - PermissionFlagsBits.SendMessages, - PermissionFlagsBits.ReadMessageHistory, - PermissionFlagsBits.EmbedLinks, - PermissionFlagsBits.AttachFiles, - PermissionFlagsBits.ManageMessages, - ], - }, - ]; - // Chercher ou créer la catégorie "Tickets" - let ticketCategory = interaction.guild.channels.cache.find(ch => ch.type === ChannelType.GuildCategory && ch.name.toLowerCase().includes('ticket')); - let channel; - if (!ticketCategory) { - ticketCategory = null; // Créer sans catégorie si non trouvée + const [existingTickets] = await db.query( + 'SELECT * FROM tickets WHERE userId = ? AND guildId = ? AND status = ?', + [interaction.user.id, interaction.guild.id, 'Ouvert'] + ); + + if (existingTickets.length > 0) { + const existingTicket = existingTickets[0]; + const channel = interaction.guild.channels.cache.get(existingTicket.channelId); + return interaction.editReply({ + content: `❌ Tu as déjà un ticket ouvert : ${channel ? channel.toString() : `ID: ${existingTicket.ticketId}`}` + }); } - channel = await interaction.guild.channels.create({ - name: channelName, - type: ChannelType.GuildText, - parent: ticketCategory?.id, - permissionOverwrites, - reason: `Ticket candidature créé via Modal by ${interaction.user.tag} (${ticketId})`, - }); - // Ajout BDD + + let ticketCategory = interaction.guild.channels.cache.find( + ch => ch.type === ChannelType.GuildCategory && ch.name.toLowerCase().includes('ticket') + ); + + if (!ticketCategory) { + try { + ticketCategory = await interaction.guild.channels.create({ + name: '🎫 Tickets', + type: ChannelType.GuildCategory, + permissionOverwrites: [ + { id: interaction.guild.id, deny: [PermissionFlagsBits.ViewChannel] }, + { id: interaction.client.user.id, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.ManageChannels, PermissionFlagsBits.SendMessages] }, + ], + }); + } catch (err) { ticketCategory = null; } + } + + const ticketId = generateTicketId(type); + const cleanUsername = interaction.user.username.toLowerCase().replace(/[^a-z0-9-]/g, '').substring(0, 20); + const typeName = type.toLowerCase().replace(/\s+/g, '-').substring(0, 20); + const channelName = `${typeName}-${cleanUsername}`.substring(0, 100); + + let channel; + // Permissions initiales : Le user voit le salon + const userPerms = [ + { id: interaction.guild.id, deny: [PermissionFlagsBits.ViewChannel] }, + { id: interaction.user.id, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.SendMessages, PermissionFlagsBits.AttachFiles] }, + { id: interaction.client.user.id, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.SendMessages, PermissionFlagsBits.ManageMessages, PermissionFlagsBits.EmbedLinks, PermissionFlagsBits.AttachFiles] }, + ]; + + try { + channel = await interaction.guild.channels.create({ + name: channelName, + type: ChannelType.GuildText, + parent: ticketCategory?.id, + permissionOverwrites: userPerms, + }); + } catch (createErr) { + channel = await interaction.guild.channels.create({ + name: channelName, + type: ChannelType.GuildText, + permissionOverwrites: userPerms, + }); + } + + const modRoles = interaction.guild.roles.cache.filter(role => role.permissions.has(PermissionFlagsBits.ManageMessages) && !role.managed); + for (const role of modRoles.values()) { + await channel.permissionOverwrites.edit(role.id, { ViewChannel: true, SendMessages: true, ReadMessageHistory: true }); + } + await db.query( `INSERT INTO tickets (ticketId, channelId, userId, userTag, guildId, type, status, createdAt) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, - [ticketId, channel.id, interaction.user.id, interaction.user.tag, interaction.guild.id, 'Candidature', 'Ouvert', Date.now()] + [ticketId, channel.id, interaction.user.id, interaction.user.tag, interaction.guild.id, type, 'Ouvert', Date.now()] ); - // Réponses modal -> BDD - for (let i = 0; i < Math.min(CANDIDATURE_QUESTIONS.length,5); i++) { - const qLabel = CANDIDATURE_QUESTIONS[i]; - const field = interaction.fields.getTextInputValue(`cand_q${i+1}`); - await db.query( - 'INSERT INTO candidature_responses (ticketId, questionNumber, question, response, timestamp) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE response = VALUES(response), timestamp = VALUES(timestamp)', - [ticketId, i+1, qLabel, field, Date.now()] - ); - } - // Staff perms - const modRoles = interaction.guild.roles.cache.filter(role => - role.permissions.has(PermissionFlagsBits.ManageMessages) && - !role.managed - ); - for (const role of modRoles.values()) { - await channel.permissionOverwrites.edit(role.id, { - ViewChannel: true, - SendMessages: true, - ReadMessageHistory: true, - }); - } - // Embed recap dans le ticket - const embed = new EmbedBuilder() - .setTitle('✅ Nouvelle candidature staff !') - .setColor(0x10b981) - .setDescription(`<@${interaction.user.id}> a complété sa candidature. Voici ses réponses :`) - .addFields(...CANDIDATURE_QUESTIONS.map((q, idx) => ({ - name: `Question ${idx+1}`, - value: `**${q}**\n${interaction.fields.getTextInputValue(`cand_q${idx+1}`)}`, - }))) - .setFooter({ text: `Ticket ID: ${ticketId}` }) + + const typeEmojis = { 'Support': '💬', 'Plainte': '📢', 'Plainte Staff': '⚠️', 'Candidature': '📝', 'Problème Technique': '🔧' }; + + const welcomeEmbed = new EmbedBuilder() + .setColor(colors.success) + .setTitle(`${typeEmojis[type] || '🎫'} Ticket Ouvert : ${type}`) + .setDescription(`👋 Bonjour ${interaction.user.toString()} !\n\nUn membre de l'équipe va prendre en charge votre demande.`) + .addFields( + { name: '📋 Sujet de la demande', value: `\`\`\`${subject}\`\`\``, inline: false }, + { name: '🆔 ID', value: `\`${ticketId}\``, inline: true }, + { name: '📅 Date', value: ``, inline: true } + ) + .setThumbnail(interaction.user.displayAvatarURL({ dynamic: true })) + .setFooter({ text: 'Femboy Croissant Bot • Support', iconURL: interaction.client.user.displayAvatarURL() }) .setTimestamp(); - await channel.send({ embeds: [embed] }); - await interaction.reply({ - content: `✅ Salon de candidature créé ! ${channel.toString()}\nLe staff va étudier ta demande.`, - ephemeral: true + + const row = new ActionRowBuilder().addComponents( + new ButtonBuilder().setCustomId(`ticket_close_${ticketId}`).setLabel('Fermer').setStyle(ButtonStyle.Danger).setEmoji('🔒'), + new ButtonBuilder().setCustomId(`ticket_claim_${ticketId}`).setLabel('Réclamer').setStyle(ButtonStyle.Secondary).setEmoji('👋') + ); + + await channel.send({ content: `${interaction.user} <@&${modRoles.first()?.id || interaction.user.id}>`, embeds: [welcomeEmbed], components: [row] }); + await interaction.editReply({ content: `✅ Ticket créé avec succès ! ${channel.toString()}` }); + + } catch (err) { + console.error('Erreur creation ticket:', err); + await interaction.editReply({ content: `❌ Erreur: ${err.message}` }); + } +} + +// 1. Point d'entrée pour la fermeture (Bouton ou Slash) +async function handleClose(interaction) { + // 1. Vérification Permissions (User ne doit pas pouvoir fermer) + if (!interaction.member.permissions.has(PermissionFlagsBits.ManageMessages)) { + return interaction.reply({ content: '❌ Seuls les membres du staff peuvent fermer un ticket.', flags: MessageFlags.Ephemeral }); + } + + if (interaction.isButton()) { + const modal = new ModalBuilder().setCustomId('ticket_close_reason_modal').setTitle('Fermeture du Ticket'); + const input = new TextInputBuilder().setCustomId('reason').setLabel('Raison').setStyle(TextInputStyle.Paragraph).setRequired(true); + modal.addComponents(new ActionRowBuilder().addComponents(input)); + await interaction.showModal(modal); + return; + } + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); + let reason = interaction.options?.getString('reason') || 'Aucune raison fournie'; + await processTicketClose(interaction, reason); +} + +async function handleCloseModal(interaction) { + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); + // Check permission again for security + if (!interaction.member.permissions.has(PermissionFlagsBits.ManageMessages)) { + return interaction.editReply({ content: '❌ Action non autorisée.' }); + } + const reason = interaction.fields.getTextInputValue('reason') || 'Aucune raison fournie'; + await processTicketClose(interaction, reason); +} + +// 3. Logique commune de fermeture +async function processTicketClose(interaction, reason) { + try { + const [tickets] = await db.query('SELECT * FROM tickets WHERE channelId = ?', [interaction.channel.id]); + if (!tickets.length) return interaction.editReply({ content: '❌ Erreur ticket.' }); + const ticket = tickets[0]; + + await db.query('UPDATE tickets SET status = ?, closedAt = ?, closedBy = ? WHERE ticketId = ?', ['Fermé', Date.now(), interaction.user.id, ticket.ticketId]); + + // --- GENERATION TRANSCRIPT AUTO --- + try { + const [messages] = await db.query('SELECT * FROM ticket_messages WHERE ticketId = ? ORDER BY timestamp', [ticket.ticketId]); + const candidatureResponses = ticket.type === 'Candidature' ? await getCandidatureResponses(ticket.ticketId) : null; + + const htmlContent = generateTranscriptHTML(ticket, messages, candidatureResponses, true); + + // Structure dossiers + const date = new Date(ticket.createdAt); + const dateFolder = date.toISOString().split('T')[0]; + const typeFolder = ticket.type.toLowerCase().replace(/\s+/g, '-'); + const cleanUsername = ticket.userTag.replace(/[^a-zA-Z0-9-_]/g, '-').toLowerCase(); + + const transcriptsBaseDir = path.join(process.cwd(), 'transcripts'); + const dateDir = path.join(transcriptsBaseDir, typeFolder, dateFolder); + if (!fs.existsSync(dateDir)) fs.mkdirSync(dateDir, { recursive: true }); + + // Nom de fichier unique avec ID du ticket + const fileName = `${dateFolder}-${cleanUsername}-${ticket.ticketId}.html`; + const filePath = path.join(dateDir, fileName); + fs.writeFileSync(filePath, htmlContent, 'utf8'); + + // Chemin relatif pour la DB (ex: transcripts/support/2025-01-01/file.html) + const dbPath = `transcripts/${typeFolder}/${dateFolder}/${fileName}`; + + await db.query('UPDATE tickets SET transcriptPath = ? WHERE ticketId = ?', [dbPath, ticket.ticketId]); + + } catch (transcriptErr) { + console.error('Erreur génération transcript auto:', transcriptErr); + } + // ---------------------------------- + + const closeEmbed = new EmbedBuilder() + .setTitle('🔒 Ticket Fermé') + .setColor(colors.error) + .setDescription(`Ticket clôturé par ${interaction.user}.`) + .addFields( + { name: '📝 Raison', value: `\`\`\`${reason}\`\`\``, inline: false }, + { name: '👮 Géré par', value: ticket.claimedBy ? `<@${ticket.claimedBy}>` : '> *Personne*', inline: true } + ); + + // BOUTONS DE GESTION APRES FERMETURE + const row = new ActionRowBuilder().addComponents( + new ButtonBuilder().setCustomId(`ticket_reopen_${ticket.ticketId}`).setLabel('Rouvrir').setStyle(ButtonStyle.Success).setEmoji('🔓'), + new ButtonBuilder().setCustomId(`ticket_delete_${ticket.ticketId}`).setLabel('Supprimer').setStyle(ButtonStyle.Danger).setEmoji('🗑️') + ); + + const closeMsg = await interaction.channel.send({ embeds: [closeEmbed], components: [row] }); + + if (!interaction.channel.name.startsWith('🔒-')) { + await interaction.channel.setName(`🔒-${interaction.channel.name}`).catch(() => {}); + } + + // VISIBILITE : On retire la vue au membre + await interaction.channel.permissionOverwrites.edit(ticket.userId, { ViewChannel: false }); + + // Désactivation des ANCIENS boutons (Sauf le nouveau message de fermeture) + try { + const messages = await interaction.channel.messages.fetch({ limit: 20 }); + const oldMessages = messages.filter(m => m.author.id === interaction.client.user.id && m.components.length > 0 && m.id !== closeMsg.id); + for (const oldMsg of oldMessages.values()) { + const newRows = oldMsg.components.map(row => { + const newRow = new ActionRowBuilder(); + row.components.forEach(c => newRow.addComponents(ButtonBuilder.from(c).setDisabled(true))); + return newRow; + }); + await oldMsg.edit({ components: newRows }); + } + } catch (e) {} + + await interaction.editReply({ content: '✅ Ticket fermé.' }); + } catch (err) { await interaction.editReply({ content: `❌ Erreur: ${err.message}` }); } +} + +async function handleTranscript(interaction) { + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); + try { + const [tickets] = await db.query('SELECT * FROM tickets WHERE channelId = ?', [interaction.channel.id]); + if (tickets.length === 0) return interaction.editReply({ content: '❌ Ce canal n\'est pas un ticket.' }); + const ticket = tickets[0]; + + const [messages] = await db.query('SELECT * FROM ticket_messages WHERE ticketId = ? ORDER BY timestamp', [ticket.ticketId]); + + // Structure dossiers + const date = new Date(ticket.createdAt); + const dateFolder = date.toISOString().split('T')[0]; + const typeFolder = ticket.type.toLowerCase().replace(/\s+/g, '-'); + const cleanUsername = ticket.userTag.replace(/[^a-zA-Z0-9-_]/g, '-').toLowerCase(); + + const transcriptsBaseDir = path.join(process.cwd(), 'transcripts'); + const dateDir = path.join(transcriptsBaseDir, typeFolder, dateFolder); + if (!fs.existsSync(dateDir)) fs.mkdirSync(dateDir, { recursive: true }); + + // Génération + const candidatureResponses = ticket.type === 'Candidature' ? await getCandidatureResponses(ticket.ticketId) : null; + const htmlContent = generateTranscriptHTML(ticket, messages, candidatureResponses, true); + + // Nom de fichier unique avec ID du ticket + const fileName = `${dateFolder}-${cleanUsername}-${ticket.ticketId}.html`; + const filePath = path.join(dateDir, fileName); + fs.writeFileSync(filePath, htmlContent, 'utf8'); + + const webPath = `transcripts/${typeFolder}/${dateFolder}/${fileName}`; + const webUrl = process.env.TRANSCRIPT_WEB_URL || 'transcript.syxpi.fr'; + + // Mise à jour DB + const dbPath = `transcripts/${typeFolder}/${dateFolder}/${fileName}`; + await db.query('UPDATE tickets SET transcriptPath = ? WHERE ticketId = ?', [dbPath, ticket.ticketId]); + + await interaction.editReply({ + content: `✅ **Transcription générée !**\n\n📄 **Fichier local:** \`${fileName}\`\n🌐 **Lien Web:** https://${webUrl}/${webPath}`, + files: [{ attachment: filePath, name: fileName }] }); } catch (err) { - console.error('Erreur candidature modal:', err); - try { - await interaction.reply({ - content: '❌ Une erreur est survenue lors de la soumission de ta candidature.', - ephemeral: true - }); - } catch {} + console.error(err); + await interaction.editReply({ content: `❌ Erreur: ${err.message}` }); } -}; +} + +async function handleReopen(interaction) { + if (interaction.isButton()) { + const modal = new ModalBuilder().setCustomId('ticket_reopen_modal').setTitle('Réouverture du Ticket'); + const input = new TextInputBuilder().setCustomId('reason').setLabel('Raison').setStyle(TextInputStyle.Paragraph).setRequired(true); + modal.addComponents(new ActionRowBuilder().addComponents(input)); + await interaction.showModal(modal); + return; + } + await handleReopenModal(interaction, "Commande Slash"); +} + +async function handleReopenModal(interaction, slashReason = null) { + if (!slashReason) await interaction.deferReply({ flags: MessageFlags.Ephemeral }); + const reason = slashReason || interaction.fields.getTextInputValue('reason'); + + try { + const [tickets] = await db.query('SELECT * FROM tickets WHERE channelId = ?', [interaction.channel.id]); + const ticket = tickets[0]; + + await db.query('UPDATE tickets SET status = ?, closedAt = NULL, closedBy = NULL WHERE ticketId = ?', ['Ouvert', ticket.ticketId]); + + // Restituer la vue + await interaction.channel.permissionOverwrites.edit(ticket.userId, { ViewChannel: true, SendMessages: true }); + + if (interaction.channel.name.startsWith('🔒-')) { + await interaction.channel.setName(interaction.channel.name.replace('🔒-', '')); + } + + const embed = new EmbedBuilder() + .setTitle('🔓 Ticket Réouvert') + .setColor(colors.success) + .setDescription(`Le ticket a été rouvert par ${interaction.user}.`) + .addFields({ name: '📝 Raison', value: `\`\`\`${reason}\`\`\`` }); + + // IMPORTANT : On remet le bouton FERMER + const row = new ActionRowBuilder().addComponents( + new ButtonBuilder().setCustomId(`ticket_close_${ticket.ticketId}`).setLabel('Fermer').setStyle(ButtonStyle.Danger).setEmoji('🔒') + ); + + await interaction.channel.send({ embeds: [embed], components: [row] }); + + // Supprimer le message de fermeture précédent + try { + const messages = await interaction.channel.messages.fetch({ limit: 10 }); + const closeMsg = messages.find(m => m.embeds[0]?.title === '🔒 Ticket Fermé'); + if (closeMsg) await closeMsg.delete(); + } catch (e) {} + + const msg = { content: '✅ Ticket rouvert.' }; + if (interaction.replied || interaction.deferred) await interaction.editReply(msg); + else await interaction.reply({ ...msg, flags: MessageFlags.Ephemeral }); + + } catch (err) { console.error(err); } +} + +async function handleAdd(interaction) { + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); + try { + const user = interaction.options.getUser('user'); + await interaction.channel.permissionOverwrites.edit(user.id, { ViewChannel: true, SendMessages: true, ReadMessageHistory: true }); + + const embed = new EmbedBuilder() + .setTitle('👤 Utilisateur Ajouté') + .setColor(colors.info) + .setDescription(`${user.toString()} a été ajouté au ticket par ${interaction.user.toString()}.`) + .setTimestamp(); + + await interaction.channel.send({ embeds: [embed] }); + await interaction.editReply({ content: `✅ ${user.tag} ajouté.` }); + } catch (err) { + await interaction.editReply({ content: `❌ Erreur: ${err.message}` }); + } +} + +async function handleClaim(interaction) { + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); + if (!interaction.member.permissions.has(PermissionFlagsBits.ManageMessages)) return interaction.editReply({ content: '❌ Staff uniquement.' }); + + try { + const [tickets] = await db.query('SELECT * FROM tickets WHERE channelId = ?', [interaction.channel.id]); + if (!tickets.length) return interaction.editReply({ content: '❌ Pas un ticket.' }); + const ticket = tickets[0]; + + if (ticket.claimedBy === interaction.user.id) { + await db.query('UPDATE tickets SET claimedBy = NULL, claimedByTag = NULL WHERE ticketId = ?', [ticket.ticketId]); + await interaction.channel.send({ embeds: [new EmbedBuilder().setColor(colors.info).setDescription(`🛑 **Ticket libéré** par ${interaction.user.toString()}.`)] }); + return interaction.editReply({ content: '✅ Ticket libéré.' }); + } + + if (ticket.claimedBy) return interaction.editReply({ content: `❌ Déjà réclamé par quelqu'un d'autre.` }); + + await db.query('UPDATE tickets SET claimedBy = ?, claimedByTag = ?, claimedAt = ? WHERE ticketId = ?', [interaction.user.id, interaction.user.tag, Date.now(), ticket.ticketId]); + + const embed = new EmbedBuilder() + .setColor(colors.success) + .setTitle('👋 Ticket Pris en Charge') + .setDescription(`Ce ticket est désormais géré par ${interaction.user.toString()}.`) + .setThumbnail(interaction.user.displayAvatarURL({ dynamic: true })) + .setTimestamp(); + + await interaction.channel.send({ embeds: [embed] }); + await interaction.editReply({ content: '✅ Ticket réclamé.' }); + } catch (err) { + await interaction.editReply({ content: `❌ Erreur: ${err.message}` }); + } +} + +async function handleDelete(interaction) { + // Suppression directe sans modal + await handleDeleteModal(interaction, "Suppression demandée par l'utilisateur"); +} + +async function handleDeleteModal(interaction, slashReason = null) { + // Si l'interaction n'a pas été différée ou répondue, on le fait + if (!interaction.deferred && !interaction.replied) { + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); + } + + try { + const [tickets] = await db.query('SELECT * FROM tickets WHERE channelId = ?', [interaction.channel.id]); + if (tickets.length) { + await db.query('UPDATE tickets SET status = ?, closedAt = ?, closedBy = ? WHERE ticketId = ?', ['Supprimé', Date.now(), interaction.user.id, tickets[0].ticketId]); + } + await interaction.channel.delete(); + } catch (err) { console.error(err); } +} + +// Fonction spécifique pour le submit du modal +async function handleCandidatureModalSubmit(interaction) { + const ticketId = generateTicketId('Candidature'); + const channelName = `candidature-${interaction.user.username.replace(/[^a-z0-9]/gi, '').substring(0,15)}`; + + try { + let category = interaction.guild.channels.cache.find(c => c.type === ChannelType.GuildCategory && c.name.toLowerCase().includes('ticket')); + const channel = await interaction.guild.channels.create({ + name: channelName, type: ChannelType.GuildText, parent: category?.id, + permissionOverwrites: [ + { id: interaction.guild.id, deny: [PermissionFlagsBits.ViewChannel] }, + { id: interaction.user.id, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.SendMessages] }, + { id: interaction.client.user.id, allow: [PermissionFlagsBits.ViewChannel, PermissionFlagsBits.ManageChannels] } + ] + }); + + await db.query(`INSERT INTO tickets (ticketId, channelId, userId, userTag, guildId, type, status, createdAt) VALUES (?, ?, ?, ?, ?, 'Candidature', 'Ouvert', ?)`, [ticketId, channel.id, interaction.user.id, interaction.user.tag, interaction.guild.id, Date.now()]); + + const fields = []; + for (let i = 0; i < Math.min(CANDIDATURE_QUESTIONS.length, 5); i++) { + const val = interaction.fields.getTextInputValue(`cand_q${i+1}`); + // Correction: Utilisation de Date.now() au lieu de new Date() pour le timestamp + await db.query('INSERT INTO candidature_responses (ticketId, questionNumber, question, response, timestamp) VALUES (?, ?, ?, ?, ?)', [ticketId, i+1, CANDIDATURE_QUESTIONS[i], val, Date.now()]); + // Utiliser la question complète comme nom de champ + fields.push({ name: CANDIDATURE_QUESTIONS[i], value: val.substring(0, 1024) }); + } + + const embed = new EmbedBuilder() + .setTitle('📝 Nouvelle Candidature Staff') + .setColor(colors.warning) + .setDescription(`Candidature soumise par ${interaction.user.toString()} (\`${interaction.user.tag}\`)`) + .setThumbnail(interaction.user.displayAvatarURL({ dynamic: true })) + .addFields(fields) + .addFields( + { name: '━━━━━━━━━━━━━━━━', value: 'ℹ️ **Informations**' }, + { name: '🆔 ID Ticket', value: `\`${ticketId}\``, inline: true }, + { name: '📅 Soumis le', value: ``, inline: true } + ) + .setFooter({ text: 'Femboy Croissant Bot • Recrutement', iconURL: interaction.client.user.displayAvatarURL() }) + .setTimestamp(); + + const row = new ActionRowBuilder().addComponents( + new ButtonBuilder().setCustomId(`ticket_close_${ticketId}`).setLabel('Fermer').setStyle(ButtonStyle.Danger).setEmoji('🔒'), + new ButtonBuilder().setCustomId(`ticket_claim_${ticketId}`).setLabel('Traiter').setStyle(ButtonStyle.Success).setEmoji('✅') + ); + + await channel.send({ content: '@here Nouvelle candidature', embeds: [embed], components: [row] }); + await interaction.reply({ content: `✅ Candidature envoyée : ${channel.toString()}`, flags: MessageFlags.Ephemeral }); + } catch (e) { console.error(e); } +} +// Exports +commandModule.handleCreate = handleCreate; +commandModule.handleClose = handleClose; +commandModule.handleCloseModal = handleCloseModal; +commandModule.handleReopen = handleReopen; +commandModule.handleReopenModal = handleReopenModal; +commandModule.handleDelete = handleDelete; +commandModule.handleDeleteModal = handleDeleteModal; +commandModule.handleAdd = handleAdd; +commandModule.handleClaim = handleClaim; +commandModule.handleTranscript = handleTranscript; +commandModule.handleCandidatureModalSubmit = handleCandidatureModalSubmit; module.exports = commandModule; module.exports.CANDIDATURE_QUESTIONS = CANDIDATURE_QUESTIONS; +module.exports.generateTicketId = generateTicketId; \ No newline at end of file diff --git a/commands/utility/ping.js b/commands/utility/ping.js index 973ce03..d32f9e5 100644 --- a/commands/utility/ping.js +++ b/commands/utility/ping.js @@ -6,7 +6,8 @@ module.exports = { .setName('ping') .setDescription('Affiche la latence du bot.'), async execute(interaction) { - const sent = await interaction.deferReply({ fetchReply: true }); + await interaction.deferReply(); + const sent = await interaction.fetchReply(); const apiLatency = Math.round(interaction.client.ws.ping); const roundTripLatency = sent.createdTimestamp - interaction.createdTimestamp; @@ -29,4 +30,4 @@ module.exports = { await interaction.editReply({ embeds: [embed] }); }, -}; +}; \ No newline at end of file diff --git a/commands/xp/bumptime.js b/commands/xp/bumptime.js index edb434b..17edaf3 100644 --- a/commands/xp/bumptime.js +++ b/commands/xp/bumptime.js @@ -1,86 +1,79 @@ -const { SlashCommandBuilder, EmbedBuilder } = require('discord.js'); +const { SlashCommandBuilder, EmbedBuilder, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); -const { colors } = require('../../utils/constants.js'); +const { colors, emojis } = require('../../utils/constants.js'); module.exports = { - category: 'xp', - data: new SlashCommandBuilder() - .setName('bumptime') - .setDescription('Vérifier le dernier bump et le temps restant avant le prochain'), - async execute(interaction) { - await interaction.deferReply({ ephemeral: true }); - - try { - // Récupérer le dernier bump pour ce serveur - const [bumps] = await db.query( - 'SELECT * FROM bumps WHERE guildId = ? ORDER BY bumpTime DESC LIMIT 1', - [interaction.guild.id] - ); - - if (bumps.length === 0) { - return interaction.editReply({ - content: '❌ Aucun bump enregistré pour ce serveur.' - }); - } - - const lastBump = bumps[0]; - const bumpTime = lastBump.bumpTime; - const now = Date.now(); - const timeSinceBump = now - bumpTime; - const twoHours = 2 * 60 * 60 * 1000; - const timeUntilNextBump = twoHours - timeSinceBump; - - // Récupérer l'utilisateur qui a fait le bump - const user = await interaction.client.users.fetch(lastBump.userId).catch(() => null); - const userTag = user ? user.tag : `ID: ${lastBump.userId}`; - - const { emojis } = require('../../utils/constants'); - - const embed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.guild.name}`, - iconURL: interaction.guild.iconURL({ dynamic: true }) || undefined - }) - .setTimestamp(); - - if (timeUntilNextBump > 0) { - // Le prochain bump n'est pas encore disponible - const hours = Math.floor(timeUntilNextBump / (60 * 60 * 1000)); - const minutes = Math.floor((timeUntilNextBump % (60 * 60 * 1000)) / (60 * 1000)); - const seconds = Math.floor((timeUntilNextBump % (60 * 1000)) / 1000); - - embed.setTitle('⏳ Bump en Cooldown') - .setColor(colors.warning) - .setDescription(`Le dernier bump a été effectué il y a moins de 2 heures.`) - .addFields( - { name: '👤 Dernier bump par', value: `\`${userTag}\``, inline: true }, - { name: '⏰ Il y a', value: `\`${Math.floor(timeSinceBump / (60 * 60 * 1000))}h ${Math.floor((timeSinceBump % (60 * 60 * 1000)) / (60 * 1000))}m\``, inline: true }, - { name: '🕐 Temps restant', value: `\`${hours}h ${minutes}m ${seconds}s\``, inline: true }, - { name: '📅 Prochain bump disponible', value: ``, inline: false } - ) - .setFooter({ text: 'Utilise /bump (Disboard) pour bump le serveur' }); - } else { - // Le prochain bump est disponible - embed.setTitle(`${emojis.success} Bump Disponible`) - .setColor(colors.success) - .setDescription(`**Le serveur peut être bumpé maintenant !**`) - .addFields( - { name: '👤 Dernier bump par', value: `\`${userTag}\``, inline: true }, - { name: '⏰ Il y a', value: `\`${Math.floor(timeSinceBump / (60 * 60 * 1000))}h ${Math.floor((timeSinceBump % (60 * 60 * 1000)) / (60 * 1000))}m\``, inline: true }, - { name: '✅ Statut', value: '**Disponible**', inline: true }, - { name: '💡 Astuce', value: 'Utilise `/bump` (Disboard) pour bump le serveur !', inline: false } - ) - .setFooter({ text: 'Utilise /bump (Disboard) pour bump le serveur' }); - } - - await interaction.editReply({ embeds: [embed] }); - - } catch (err) { - console.error('Erreur lors de la vérification du bump:', err); - await interaction.editReply({ - content: '❌ Erreur lors de la vérification du bump.' - }); - } - }, -}; - + category: 'xp', + data: new SlashCommandBuilder() + .setName('bumptime') + .setDescription('Vérifier le dernier bump et le temps restant avant le prochain'), + async execute(interaction) { + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); + + try { + const [bumps] = await db.query( + 'SELECT * FROM bumps WHERE guildId = ? ORDER BY bumpTime DESC LIMIT 1', + [interaction.guild.id] + ); + + if (bumps.length === 0) { + return interaction.editReply({ + content: '❌ Aucun bump enregistré pour ce serveur.' + }); + } + + const lastBump = bumps[0]; + const bumpTime = parseInt(lastBump.bumpTime, 10); + const now = Date.now(); + const timeSinceBump = now - bumpTime; + const twoHours = 2 * 60 * 60 * 1000; + const timeUntilNextBump = twoHours - timeSinceBump; + + const user = await interaction.client.users.fetch(lastBump.userId).catch(() => null); + const userTag = user ? user.tag : `ID: ${lastBump.userId}`; + + const embed = new EmbedBuilder() + .setAuthor({ + name: interaction.guild.name, + iconURL: interaction.guild.iconURL({ dynamic: true }) || undefined + }) + .setTimestamp(); + + if (timeUntilNextBump > 0) { + const hours = Math.floor(timeUntilNextBump / (60 * 60 * 1000)); + const minutes = Math.floor((timeUntilNextBump % (60 * 60 * 1000)) / (60 * 1000)); + const seconds = Math.floor((timeUntilNextBump % (60 * 1000)) / 1000); + + embed.setTitle('⏳ Bump en Cooldown') + .setColor(colors.warning) + .setDescription(`Le dernier bump a été effectué il y a moins de 2 heures.`) + .addFields( + { name: '👤 Dernier bump par', value: `\`${userTag}\``, inline: true }, + { name: '⏰ Il y a', value: `\`${Math.floor(timeSinceBump / (60 * 60 * 1000))}h ${Math.floor((timeSinceBump % (60 * 60 * 1000)) / (60 * 1000))}m\``, inline: true }, + { name: '🕐 Temps restant', value: `\`${hours}h ${minutes}m ${seconds}s\``, inline: true }, + { name: '📅 Prochain bump disponible', value: ``, inline: false } + ) + .setFooter({ text: 'Utilise /bump (Disboard) pour bump le serveur' }); + } else { + embed.setTitle(`${emojis.success} Bump Disponible`) + .setColor(colors.success) + .setDescription(`**Le serveur peut être bumpé maintenant !**`) + .addFields( + { name: '👤 Dernier bump par', value: `\`${userTag}\``, inline: true }, + { name: '⏰ Il y a', value: `\`${Math.floor(timeSinceBump / (60 * 60 * 1000))}h ${Math.floor((timeSinceBump % (60 * 60 * 1000)) / (60 * 1000))}m\``, inline: true }, + { name: '✅ Statut', value: '**Disponible**', inline: true }, + { name: '💡 Astuce', value: 'Utilise `/bump` (Disboard) pour bump le serveur !', inline: false } + ) + .setFooter({ text: 'Utilise /bump (Disboard) pour bump le serveur' }); + } + + await interaction.editReply({ embeds: [embed] }); + + } catch (err) { + console.error('Erreur bumptime:', err); + await interaction.editReply({ + content: '❌ Erreur lors de la vérification du bump.' + }); + } + }, +}; \ No newline at end of file diff --git a/commands/xp/leaderboard.js b/commands/xp/leaderboard.js index bef6b37..0462858 100644 --- a/commands/xp/leaderboard.js +++ b/commands/xp/leaderboard.js @@ -1,72 +1,65 @@ const { SlashCommandBuilder, EmbedBuilder } = require('discord.js'); const { getLeaderboard, getXPProgress } = require('../../functions/xp/xp.js'); -const { colors } = require('../../utils/constants'); +const { colors, emojis } = require('../../utils/constants'); module.exports = { - category: 'xp', - data: new SlashCommandBuilder() - .setName('leaderboard') - .setDescription('Affiche le classement des niveaux') - .addIntegerOption(option => - option.setName('limit') - .setDescription('Nombre d\'utilisateurs à afficher (par défaut: 10)') - .setRequired(false) - .setMinValue(1) - .setMaxValue(25)), - async execute(interaction) { - await interaction.deferReply(); - - const limit = interaction.options.getInteger('limit') || 10; - const leaderboard = await getLeaderboard(interaction.guild.id, limit); - - if (leaderboard.length === 0) { - return interaction.editReply({ - content: '❌ Aucun utilisateur trouvé dans le classement.' - }); - } - - // Récupérer les informations des utilisateurs - const leaderboardData = []; - for (const user of leaderboard) { - try { - const member = await interaction.guild.members.fetch(user.userId).catch(() => null); - if (member) { - leaderboardData.push({ - user: member.user, - xp: user.xp, - level: user.level - }); - } - } catch (err) { - // Ignorer les erreurs - } - } - - const { emojis } = require('../../utils/constants'); - - // Créer la description du classement - const medals = ['🥇', '🥈', '🥉']; - const description = leaderboardData.map((data, index) => { - const medal = medals[index] || `\`${index + 1}.\``; - const progress = getXPProgress(data.xp, data.level); - return `${medal} **${data.user.displayName}** • ${emojis.level} Niveau \`${data.level}\` • ${emojis.xp} \`${data.xp.toLocaleString()} XP\` • \`${progress.percentage}%\``; - }).join('\n'); - - const embed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.guild.name}`, - iconURL: interaction.guild.iconURL({ dynamic: true }) || undefined - }) - .setTitle(`${emojis.leaderboard} Classement des Niveaux`) - .setColor(colors.xp) - .setDescription(description || 'Aucun utilisateur dans le classement') - .setFooter({ - text: `Top ${limit} • ${interaction.guild.name}`, - iconURL: interaction.guild.iconURL({ dynamic: true }) || undefined - }) - .setTimestamp(); - - await interaction.editReply({ embeds: [embed] }); - }, -}; - + category: 'xp', + data: new SlashCommandBuilder() + .setName('leaderboard') + .setDescription('Affiche le classement des niveaux') + .addIntegerOption(option => + option.setName('limit') + .setDescription('Nombre d\'utilisateurs à afficher (par défaut: 10)') + .setRequired(false) + .setMinValue(1) + .setMaxValue(25)), + async execute(interaction) { + await interaction.deferReply(); + + const limit = interaction.options.getInteger('limit') || 10; + const leaderboard = await getLeaderboard(interaction.guild.id, limit); + + if (leaderboard.length === 0) { + return interaction.editReply({ + content: '❌ Aucun utilisateur trouvé dans le classement.' + }); + } + + const leaderboardData = []; + for (const user of leaderboard) { + try { + const member = await interaction.guild.members.fetch(user.userId).catch(() => null); + if (member) { + leaderboardData.push({ + user: member.user, + xp: user.xp, + level: user.level + }); + } + } catch (err) { /* Ignorer */ } + } + + const medals = ['🥇', '🥈', '🥉']; + const description = leaderboardData.map((data, index) => { + const medal = medals[index] || `\`${index + 1}.\``; + const progress = getXPProgress(data.xp, data.level); + return `${medal} **${data.user.displayName}** • ${emojis.level} Niveau \`${data.level}\` • ${emojis.xp} \`${data.xp.toLocaleString()} XP\` • \`${progress.percentage}%\``; + }).join('\n'); + + const embed = new EmbedBuilder() + .setAuthor({ + name: interaction.guild.name, + iconURL: interaction.guild.iconURL({ dynamic: true }) || undefined + }) + .setTitle(`${emojis.leaderboard} Classement des Niveaux`) + .setColor(colors.xp) + .setDescription(description || 'Aucun utilisateur dans le classement') + .setFooter({ + text: `Top ${limit} • ${interaction.guild.name}`, + iconURL: interaction.guild.iconURL({ dynamic: true }) || undefined + }) + .setTimestamp(); + + await interaction.editReply({ embeds: [embed] }); + }, +}; \ No newline at end of file diff --git a/commands/xp/level.js b/commands/xp/level.js index 2329fc4..23bf72d 100644 --- a/commands/xp/level.js +++ b/commands/xp/level.js @@ -1,96 +1,97 @@ const { SlashCommandBuilder, EmbedBuilder } = require('discord.js'); const { getUserXP, getXPProgress, getXPForNextLevel, getUserRank } = require('../../functions/xp/xp.js'); -const { colors } = require('../../utils/constants'); +const { colors, emojis } = require('../../utils/constants'); module.exports = { - category: 'xp', - data: new SlashCommandBuilder() - .setName('level') - .setDescription('Affiche ton niveau et ton XP') - .addUserOption(option => - option.setName('user') - .setDescription('L\'utilisateur dont tu veux voir le niveau') - .setRequired(false)), - async execute(interaction) { - await interaction.deferReply(); - - const target = interaction.options.getUser('user') || interaction.user; - const userXP = await getUserXP(target.id, interaction.guild.id); - - if (!userXP) { - return interaction.editReply({ - content: '❌ Erreur lors de la récupération des données XP.' - }); - } - - const progress = getXPProgress(userXP.xp, userXP.level); - const xpForNextLevel = getXPForNextLevel(userXP.level); - const rank = await getUserRank(target.id, interaction.guild.id); - - // Créer une barre de progression visuelle - const barLength = 20; - let filled = 0; - let empty = barLength; - - // Calculer la barre de progression seulement si progress.needed > 0 - if (progress.needed > 0 && progress.current >= 0) { - const percentage = Math.min(100, Math.max(0, (progress.current / progress.needed) * 100)); - filled = Math.max(0, Math.min(barLength, Math.floor((percentage / 100) * barLength))); - empty = Math.max(0, barLength - filled); - } - - const progressBar = '█'.repeat(filled) + '░'.repeat(empty); - - const { emojis } = require('../../utils/constants'); - - const embed = new EmbedBuilder() - .setAuthor({ - name: `${target.displayName}`, - iconURL: target.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.level} Niveau ${userXP.level}`) - .setColor(colors.xp) - .setThumbnail(target.displayAvatarURL({ dynamic: true, size: 256 })) - .setDescription(`**${emojis.rank} Rang #${rank}** sur ${interaction.guild.name}`) - .addFields( - { - name: `${emojis.xp} XP Total`, - value: `\`${userXP.xp.toLocaleString()} XP\``, - inline: true - }, - { - name: '📈 Progression', - value: `\`${progress.current}/${progress.needed} XP\` (${progress.percentage}%)`, - inline: true - }, - { - name: '🎯 Prochain Niveau', - value: `\`${xpForNextLevel} XP\` requis`, - inline: true - }, - { - name: '📊 Barre de Progression', - value: `\`\`\`${progressBar}\`\`\``, - inline: false - }, - { - name: '💬 Messages', - value: `\`${(userXP.totalMessages || 0).toLocaleString()}\``, - inline: true - }, - { - name: '🎤 Temps Vocal', - value: `\`${Math.floor((userXP.totalVoiceTime || 0) / 60)}h\``, - inline: true - } - ) - .setFooter({ - text: `${interaction.guild.name} • Niveau ${userXP.level}`, - iconURL: interaction.guild.iconURL({ dynamic: true }) || undefined - }) - .setTimestamp(); - - await interaction.editReply({ embeds: [embed] }); - }, -}; + category: 'xp', + data: new SlashCommandBuilder() + .setName('level') + .setDescription('Affiche ton niveau et ton XP') + .addUserOption(option => + option.setName('user') + .setDescription('L\'utilisateur dont tu veux voir le niveau') + .setRequired(false)), + async execute(interaction) { + await interaction.deferReply(); + + const target = interaction.options.getUser('user') || interaction.user; + const userXP = await getUserXP(target.id, interaction.guild.id); + + if (!userXP) { + return interaction.editReply({ + content: '❌ Erreur lors de la récupération des données XP.' + }); + } + + const progress = getXPProgress(userXP.xp, userXP.level); + const xpForNextLevel = getXPForNextLevel(userXP.level); + const rank = await getUserRank(target.id, interaction.guild.id); + + const barLength = 20; + let filled = 0; + let empty = barLength; + + if (progress.needed > 0 && progress.current >= 0) { + const percentage = Math.min(100, Math.max(0, (progress.current / progress.needed) * 100)); + filled = Math.max(0, Math.min(barLength, Math.floor((percentage / 100) * barLength))); + empty = Math.max(0, barLength - filled); + } + + const progressBar = '█'.repeat(filled) + '░'.repeat(empty); + + // Formatage du temps vocal + const totalMinutes = userXP.totalVoiceTime || 0; + const hours = Math.floor(totalMinutes / 60); + const minutes = totalMinutes % 60; + const voiceTimeStr = `${hours}h ${minutes}m`; + const embed = new EmbedBuilder() + .setAuthor({ + name: target.displayName, + iconURL: target.displayAvatarURL({ dynamic: true }) + }) + .setTitle(`${emojis.level} Niveau ${userXP.level}`) + .setColor(colors.xp) + .setThumbnail(target.displayAvatarURL({ dynamic: true, size: 256 })) + .setDescription(`**${emojis.rank} Rang #${rank}** sur ${interaction.guild.name}`) + .addFields( + { + name: `${emojis.xp} XP Total`, + value: `\`${userXP.xp.toLocaleString()} XP\``, + inline: true + }, + { + name: '📈 Progression', + value: `\`${progress.current}/${progress.needed} XP\` (${progress.percentage}%)`, + inline: true + }, + { + name: '🎯 Prochain Niveau', + value: `\`${xpForNextLevel} XP\` requis`, + inline: true + }, + { + name: '📊 Barre de Progression', + value: `\`\`\`${progressBar}\`\`\``, + inline: false + }, + { + name: '💬 Messages', + value: `\`${(userXP.totalMessages || 0).toLocaleString()}\``, + inline: true + }, + { + name: '🎤 Temps Vocal', + value: `\`${voiceTimeStr}\``, + inline: true + } + ) + .setFooter({ + text: `${interaction.guild.name} • Niveau ${userXP.level}`, + iconURL: interaction.guild.iconURL({ dynamic: true }) || undefined + }) + .setTimestamp(); + + await interaction.editReply({ embeds: [embed] }); + }, +}; \ No newline at end of file diff --git a/commands/xp/resetlevel.js b/commands/xp/resetlevel.js index 1fdd202..398a8ff 100644 --- a/commands/xp/resetlevel.js +++ b/commands/xp/resetlevel.js @@ -1,165 +1,116 @@ -const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits } = require('discord.js'); +const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); const { getUserXP } = require('../../functions/xp/xp.js'); -const { colors } = require('../../utils/constants'); +const { colors, emojis } = require('../../utils/constants'); const { sendLog } = require('../../utils/helpers'); module.exports = { - category: 'xp', - data: new SlashCommandBuilder() - .setName('resetlevel') - .setDescription('Réinitialiser le niveau d\'un utilisateur (Admin/Modérateur uniquement)') - .addUserOption(option => - option.setName('user') - .setDescription('L\'utilisateur dont tu veux réinitialiser le niveau') - .setRequired(true)) - .addStringOption(option => - option.setName('reason') - .setDescription('Raison du reset (optionnel)') - .setRequired(false)) - .setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages), - async execute(interaction) { - await interaction.deferReply({ ephemeral: true }); - - // Vérifier les permissions (Modérateur ou Admin) - if (!interaction.member.permissions.has(PermissionFlagsBits.ManageMessages) && - !interaction.member.permissions.has(PermissionFlagsBits.Administrator)) { - return interaction.editReply({ - content: '❌ Tu n\'as pas la permission d\'utiliser cette commande. (Modérateur/Admin requis)' - }); - } - - const target = interaction.options.getUser('user'); - const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; - - if (!target) { - return interaction.editReply({ - content: '❌ Aucun utilisateur spécifié !' - }); - } - - // Vérifier que l'utilisateur ne se reset pas lui-même - if (target.id === interaction.user.id) { - return interaction.editReply({ - content: '❌ Tu ne peux pas te reset toi-même.' - }); - } - - // Vérifier que l'utilisateur ne reset pas le propriétaire du serveur - if (target.id === interaction.guild.ownerId) { - return interaction.editReply({ - content: '❌ Tu ne peux pas reset le niveau du propriétaire du serveur.' - }); - } - - // Vérifier les rôles (ne pas permettre de reset quelqu'un avec un rôle supérieur) - const targetMember = await interaction.guild.members.fetch(target.id).catch(() => null); - if (targetMember) { - if (targetMember.roles.highest.position >= interaction.member.roles.highest.position && - interaction.guild.ownerId !== interaction.user.id) { - return interaction.editReply({ - content: '❌ Tu ne peux pas reset le niveau d\'un utilisateur avec un rôle supérieur ou égal au tien.' - }); - } - } - - try { - // Récupérer les données XP de l'utilisateur avant le reset - const userXP = await getUserXP(target.id, interaction.guild.id); - - if (!userXP || userXP.xp === 0) { - return interaction.editReply({ - content: `❌ ${target.tag} n'a aucun niveau/XP à réinitialiser.` - }); - } - - const oldLevel = userXP.level; - const oldXP = userXP.xp; - const oldMessages = userXP.totalMessages || 0; - const oldVoiceTime = userXP.totalVoiceTime || 0; - - // Supprimer complètement l'utilisateur de la table user_xp - await db.query( - 'DELETE FROM user_xp WHERE userId = ? AND guildId = ?', - [target.id, interaction.guild.id] - ); - - // Supprimer aussi les logs XP de l'utilisateur (optionnel, pour un reset complet) - await db.query( - 'DELETE FROM xp_logs WHERE userId = ? AND guildId = ?', - [target.id, interaction.guild.id] - ); - - // Logger l'action dans la table logs - await db.query( - `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, - [ - target.id, - target.tag, - interaction.user.id, - interaction.user.tag, - 'Reset de niveau', - `Niveau ${oldLevel} (${oldXP} XP) réinitialisé. Raison: ${reason}`, - 'Permanent', - interaction.guild.id, - Date.now() - ] - ); - - const { emojis } = require('../../utils/constants'); - - // Envoyer un log dans le canal de logs - const logEmbed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.user.displayName}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.warning} Reset de Niveau`) - .setColor(colors.warning) - .setDescription(`Le niveau de ${target.toString()} a été réinitialisé.`) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .addFields( - { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, - { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, - { name: '📊 Niveau avant', value: `\`${oldLevel}\``, inline: true }, - { name: '📈 XP avant', value: `\`${oldXP.toLocaleString()} XP\``, inline: true }, - { name: '💬 Messages', value: `\`${oldMessages.toLocaleString()}\``, inline: true }, - { name: '🎤 Temps vocal', value: `\`${Math.floor(oldVoiceTime / 60)}h\``, inline: true }, - { name: '📝 Raison', value: reason, inline: false } - ) - .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) - .setTimestamp(); - - await sendLog(interaction.guild, { embeds: [logEmbed] }); - - // Réponse à l'utilisateur - const embed = new EmbedBuilder() - .setAuthor({ - name: `${target.displayName}`, - iconURL: target.displayAvatarURL({ dynamic: true }) - }) - .setTitle(`${emojis.success} Niveau Réinitialisé`) - .setColor(colors.success) - .setDescription(`Le niveau de ${target.toString()} a été complètement réinitialisé.`) - .setThumbnail(target.displayAvatarURL({ dynamic: true })) - .addFields( - { name: '👤 Utilisateur', value: `\`${target.tag}\``, inline: true }, - { name: '📊 Niveau avant', value: `\`${oldLevel}\``, inline: true }, - { name: '📈 XP avant', value: `\`${oldXP.toLocaleString()} XP\``, inline: true }, - { name: '📝 Raison', value: reason, inline: false } - ) - .setFooter({ text: 'Toutes les données XP ont été supprimées de la base de données.' }) - .setTimestamp(); - - await interaction.editReply({ embeds: [embed] }); - - } catch (err) { - console.error('Erreur lors du reset de niveau:', err); - await interaction.editReply({ - content: `❌ Erreur lors du reset de niveau: ${err.message}` - }); - } - }, -}; - + category: 'xp', + data: new SlashCommandBuilder() + .setName('resetlevel') + .setDescription('Réinitialiser le niveau d\'un utilisateur (Admin/Modérateur uniquement)') + .addUserOption(option => + option.setName('user') + .setDescription('L\'utilisateur dont tu veux réinitialiser le niveau') + .setRequired(true)) + .addStringOption(option => + option.setName('reason') + .setDescription('Raison du reset (optionnel)') + .setRequired(false)) + .setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages), + async execute(interaction) { + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); + + const target = interaction.options.getUser('user'); + const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; + + if (!target) return interaction.editReply({ content: '❌ Aucun utilisateur spécifié !' }); + if (target.id === interaction.user.id) return interaction.editReply({ content: '❌ Tu ne peux pas te reset toi-même.' }); + if (target.id === interaction.guild.ownerId) return interaction.editReply({ content: '❌ Tu ne peux pas reset le niveau du propriétaire du serveur.' }); + + const targetMember = await interaction.guild.members.fetch(target.id).catch(() => null); + if (targetMember) { + if (targetMember.roles.highest.position >= interaction.member.roles.highest.position && + interaction.guild.ownerId !== interaction.user.id) { + return interaction.editReply({ + content: '❌ Tu ne peux pas reset le niveau d\'un utilisateur avec un rôle supérieur ou égal au tien.' + }); + } + } + + try { + const userXP = await getUserXP(target.id, interaction.guild.id); + + if (!userXP || userXP.xp === 0) { + return interaction.editReply({ + content: `❌ ${target.tag} n'a aucun niveau/XP à réinitialiser.` + }); + } + + const oldLevel = userXP.level; + const oldXP = userXP.xp; + const oldMessages = userXP.totalMessages || 0; + const oldVoiceTime = userXP.totalVoiceTime || 0; + + await db.query('DELETE FROM user_xp WHERE userId = ? AND guildId = ?', [target.id, interaction.guild.id]); + await db.query('DELETE FROM xp_logs WHERE userId = ? AND guildId = ?', [target.id, interaction.guild.id]); + + await db.query( + `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, guildId, timestamp) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [ + target.id, + target.tag, + interaction.user.id, + interaction.user.tag, + 'Reset de niveau', + `Niveau ${oldLevel} (${oldXP} XP) réinitialisé. Raison: ${reason}`, + 'Permanent', + interaction.guild.id, + Date.now() + ] + ); + + const logEmbed = new EmbedBuilder() + .setAuthor({ name: interaction.user.displayName, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }) + .setTitle(`${emojis.warning} Reset de Niveau`) + .setColor(colors.warning) + .setDescription(`Le niveau de ${target.toString()} a été réinitialisé.`) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .addFields( + { name: '👤 Utilisateur', value: `${target.toString()}\n\`${target.tag}\``, inline: true }, + { name: '👮 Modérateur', value: `${interaction.user.toString()}\n\`${interaction.user.tag}\``, inline: true }, + { name: '📊 Niveau avant', value: `\`${oldLevel}\``, inline: true }, + { name: '📈 XP avant', value: `\`${oldXP.toLocaleString()} XP\``, inline: true }, + { name: '💬 Messages', value: `\`${oldMessages.toLocaleString()}\``, inline: true }, + { name: '🎤 Temps vocal', value: `\`${Math.floor(oldVoiceTime / 60)}h\``, inline: true }, + { name: '📝 Raison', value: reason, inline: false } + ) + .setFooter({ text: `ID: ${target.id} • ${interaction.guild.name}` }) + .setTimestamp(); + + await sendLog(interaction.guild, { embeds: [logEmbed] }); + + const embed = new EmbedBuilder() + .setAuthor({ name: target.displayName, iconURL: target.displayAvatarURL({ dynamic: true }) }) + .setTitle(`${emojis.success} Niveau Réinitialisé`) + .setColor(colors.success) + .setDescription(`Le niveau de ${target.toString()} a été complètement réinitialisé.`) + .setThumbnail(target.displayAvatarURL({ dynamic: true })) + .addFields( + { name: '👤 Utilisateur', value: `\`${target.tag}\``, inline: true }, + { name: '📊 Niveau avant', value: `\`${oldLevel}\``, inline: true }, + { name: '📈 XP avant', value: `\`${oldXP.toLocaleString()} XP\``, inline: true }, + { name: '📝 Raison', value: reason, inline: false } + ) + .setFooter({ text: 'Toutes les données XP ont été supprimées de la base de données.' }) + .setTimestamp(); + + await interaction.editReply({ embeds: [embed] }); + + } catch (err) { + console.error('Erreur resetlevel:', err); + await interaction.editReply({ content: `❌ Erreur lors du reset de niveau: ${err.message}` }); + } + }, +}; \ No newline at end of file diff --git a/commands/xp/xpexclude.js b/commands/xp/xpexclude.js index a109a7a..9003e96 100644 --- a/commands/xp/xpexclude.js +++ b/commands/xp/xpexclude.js @@ -1,154 +1,140 @@ -const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits } = require('discord.js'); +const { SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits, MessageFlags } = require('discord.js'); const db = require('../../functions/database/db.js'); const { isChannelExcluded } = require('../../functions/xp/xp.js'); -const { colors } = require('../../utils/constants'); +const { colors, emojis } = require('../../utils/constants'); module.exports = { - category: 'xp', - data: new SlashCommandBuilder() - .setName('xpexclude') - .setDescription('Gérer les salons exclus de l\'XP (Admin uniquement)') - .addSubcommand(subcommand => - subcommand - .setName('add') - .setDescription('Exclure un salon de l\'XP') - .addChannelOption(option => - option.setName('channel') - .setDescription('Le salon à exclure') - .setRequired(true)) - .addStringOption(option => - option.setName('reason') - .setDescription('Raison de l\'exclusion') - .setRequired(false))) - .addSubcommand(subcommand => - subcommand - .setName('remove') - .setDescription('Retirer un salon de l\'exclusion') - .addChannelOption(option => - option.setName('channel') - .setDescription('Le salon à retirer') - .setRequired(true))) - .addSubcommand(subcommand => - subcommand - .setName('list') - .setDescription('Liste des salons exclus')), - async execute(interaction) { - await interaction.deferReply({ ephemeral: true }); - - // Vérifier les permissions (Admin uniquement) - if (!interaction.member.permissions.has(PermissionFlagsBits.Administrator)) { - return interaction.editReply({ - content: '❌ Tu n\'as pas la permission d\'utiliser cette commande. (Administrateur requis)' - }); - } - - const subcommand = interaction.options.getSubcommand(); - - try { - if (subcommand === 'add') { - const channel = interaction.options.getChannel('channel'); - const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; - - if (!channel.isTextBased()) { - return interaction.editReply({ - content: '❌ Le salon doit être un canal texte.' - }); - } - - // Vérifier si déjà exclus - const excluded = await isChannelExcluded(channel.id, interaction.guild.id); - if (excluded) { - return interaction.editReply({ - content: `❌ Le salon ${channel.toString()} est déjà exclu de l'XP.` - }); - } - - // Ajouter l'exclusion - await db.query( - 'INSERT INTO xp_excluded_channels (channelId, guildId, reason, addedBy, addedAt) VALUES (?, ?, ?, ?, ?)', - [channel.id, interaction.guild.id, reason, interaction.user.id, Date.now()] - ); - - const { emojis } = require('../../utils/constants'); - - const embed = new EmbedBuilder() - .setTitle(`${emojis.success} Salon Exclu`) - .setColor(colors.success) - .setDescription(`Le salon ${channel.toString()} a été exclu de l'XP.`) - .addFields( - { name: '📝 Raison', value: reason, inline: false } - ) - .setFooter({ text: `${interaction.guild.name} • Système XP` }) - .setTimestamp(); - - await interaction.editReply({ embeds: [embed] }); - - } else if (subcommand === 'remove') { - const channel = interaction.options.getChannel('channel'); - - // Vérifier si exclu - const excluded = await isChannelExcluded(channel.id, interaction.guild.id); - if (!excluded) { - return interaction.editReply({ - content: `❌ Le salon ${channel.toString()} n'est pas exclu de l'XP.` - }); - } - - // Retirer l'exclusion - await db.query( - 'DELETE FROM xp_excluded_channels WHERE channelId = ? AND guildId = ?', - [channel.id, interaction.guild.id] - ); - - const { emojis } = require('../../utils/constants'); - - const embed = new EmbedBuilder() - .setTitle(`${emojis.success} Exclusion Retirée`) - .setColor(colors.success) - .setDescription(`Le salon ${channel.toString()} n'est plus exclu de l'XP.`) - .setFooter({ text: `${interaction.guild.name} • Système XP` }) - .setTimestamp(); - - await interaction.editReply({ embeds: [embed] }); - - } else if (subcommand === 'list') { - const [excludedChannels] = await db.query( - 'SELECT * FROM xp_excluded_channels WHERE guildId = ?', - [interaction.guild.id] - ); - - if (excludedChannels.length === 0) { - return interaction.editReply({ - content: '✅ Aucun salon n\'est exclu de l\'XP.' - }); - } - - const description = excludedChannels.map(ch => { - const channel = interaction.guild.channels.cache.get(ch.channelId); - return `• ${channel ? channel.toString() : `ID: ${ch.channelId}`} - ${ch.reason || 'Aucune raison'}`; - }).join('\n'); - - const { emojis } = require('../../utils/constants'); - - const embed = new EmbedBuilder() - .setAuthor({ - name: `${interaction.guild.name}`, - iconURL: interaction.guild.iconURL({ dynamic: true }) || undefined - }) - .setTitle('📋 Salons Exclus de l\'XP') - .setColor(colors.xp) - .setDescription(description || 'Aucun salon exclu') - .setFooter({ text: `${excludedChannels.length} salon(s) exclu(s)` }) - .setTimestamp(); - - await interaction.editReply({ embeds: [embed] }); - } - } catch (err) { - console.error('Erreur lors de la gestion des exclusions XP:', err); - await interaction.editReply({ - content: `❌ Erreur: ${err.message}` - }); - } - }, -}; - + category: 'xp', + data: new SlashCommandBuilder() + .setName('xpexclude') + .setDescription('Gérer les salons exclus de l\'XP (Admin uniquement)') + .addSubcommand(subcommand => + subcommand + .setName('add') + .setDescription('Exclure un salon de l\'XP') + .addChannelOption(option => + option.setName('channel') + .setDescription('Le salon à exclure') + .setRequired(true)) + .addStringOption(option => + option.setName('reason') + .setDescription('Raison de l\'exclusion') + .setRequired(false))) + .addSubcommand(subcommand => + subcommand + .setName('remove') + .setDescription('Retirer un salon de l\'exclusion') + .addChannelOption(option => + option.setName('channel') + .setDescription('Le salon à retirer') + .setRequired(true))) + .addSubcommand(subcommand => + subcommand + .setName('list') + .setDescription('Liste des salons exclus')), + async execute(interaction) { + await interaction.deferReply({ flags: MessageFlags.Ephemeral }); + + if (!interaction.member.permissions.has(PermissionFlagsBits.Administrator)) { + return interaction.editReply({ + content: '❌ Tu n\'as pas la permission d\'utiliser cette commande. (Administrateur requis)' + }); + } + + const subcommand = interaction.options.getSubcommand(); + + try { + if (subcommand === 'add') { + const channel = interaction.options.getChannel('channel'); + const reason = interaction.options.getString('reason') || 'Aucune raison fournie'; + + if (!channel.isTextBased()) { + return interaction.editReply({ + content: '❌ Le salon doit être un canal texte.' + }); + } + + const excluded = await isChannelExcluded(channel.id, interaction.guild.id); + if (excluded) { + return interaction.editReply({ + content: `❌ Le salon ${channel.toString()} est déjà exclu de l'XP.` + }); + } + + await db.query( + 'INSERT INTO xp_excluded_channels (channelId, guildId, reason, addedBy, addedAt) VALUES (?, ?, ?, ?, ?)', + [channel.id, interaction.guild.id, reason, interaction.user.id, Date.now()] + ); + + const embed = new EmbedBuilder() + .setTitle(`${emojis.success} Salon Exclu`) + .setColor(colors.success) + .setDescription(`Le salon ${channel.toString()} a été exclu de l'XP.`) + .addFields( + { name: '📝 Raison', value: reason, inline: false } + ) + .setFooter({ text: `${interaction.guild.name} • Système XP` }) + .setTimestamp(); + + await interaction.editReply({ embeds: [embed] }); + + } else if (subcommand === 'remove') { + const channel = interaction.options.getChannel('channel'); + + const excluded = await isChannelExcluded(channel.id, interaction.guild.id); + if (!excluded) { + return interaction.editReply({ + content: `❌ Le salon ${channel.toString()} n'est pas exclu de l'XP.` + }); + } + + await db.query( + 'DELETE FROM xp_excluded_channels WHERE channelId = ? AND guildId = ?', + [channel.id, interaction.guild.id] + ); + + const embed = new EmbedBuilder() + .setTitle(`${emojis.success} Exclusion Retirée`) + .setColor(colors.success) + .setDescription(`Le salon ${channel.toString()} n'est plus exclu de l'XP.`) + .setFooter({ text: `${interaction.guild.name} • Système XP` }) + .setTimestamp(); + + await interaction.editReply({ embeds: [embed] }); + + } else if (subcommand === 'list') { + const [excludedChannels] = await db.query( + 'SELECT * FROM xp_excluded_channels WHERE guildId = ?', + [interaction.guild.id] + ); + + if (excludedChannels.length === 0) { + return interaction.editReply({ + content: '✅ Aucun salon n\'est exclu de l\'XP.' + }); + } + + const description = excludedChannels.map(ch => { + const channel = interaction.guild.channels.cache.get(ch.channelId); + return `• ${channel ? channel.toString() : `ID: ${ch.channelId}`} - ${ch.reason || 'Aucune raison'}`; + }).join('\n'); + + const embed = new EmbedBuilder() + .setAuthor({ + name: interaction.guild.name, + iconURL: interaction.guild.iconURL({ dynamic: true }) || undefined + }) + .setTitle('📋 Salons Exclus de l\'XP') + .setColor(colors.xp) + .setDescription(description || 'Aucun salon exclu') + .setFooter({ text: `${excludedChannels.length} salon(s) exclu(s)` }) + .setTimestamp(); + + await interaction.editReply({ embeds: [embed] }); + } + } catch (err) { + console.error('Erreur xpexclude:', err); + await interaction.editReply({ content: `❌ Erreur: ${err.message}` }); + } + }, +}; \ No newline at end of file diff --git a/env.example b/env.example index 63443c9..b3b001c 100644 --- a/env.example +++ b/env.example @@ -1,4 +1,4 @@ -# =========================================== + =========================================== # Discord Bot Configuration # =========================================== diff --git a/events/interactionCreate.js b/events/interactionCreate.js index 9c2b55a..a4137bf 100644 --- a/events/interactionCreate.js +++ b/events/interactionCreate.js @@ -1,141 +1,119 @@ -const { Events, EmbedBuilder, PermissionFlagsBits } = require('discord.js'); +const { Events, ModalBuilder, TextInputBuilder, TextInputStyle, ActionRowBuilder, MessageFlags } = require('discord.js'); const chalk = require('chalk'); -const db = require('../functions/database/db.js'); -const { colors } = require('../utils/constants'); module.exports = { - name: Events.InteractionCreate, - async execute(interaction) { - // Gérer la soumission des modals (ex: candidature staff) - if (interaction.isModalSubmit()) { - const ticketModule = require('../commands/ticket/ticket.js'); - if (interaction.customId === 'candidature_modal') { - await ticketModule.handleCandidatureModalSubmit(interaction); - return; - } - } + name: Events.InteractionCreate, + async execute(interaction) { + try { + // --- 1. GESTION DES MODALS (Soumission) --- + if (interaction.isModalSubmit()) { + const ticketModule = require('../commands/ticket/ticket.js'); - // Gérer les boutons - if (interaction.isButton()) { -// Création de ticket via bouton - if (interaction.customId === 'ticket_create_candidature') { - // Sur clic, montrer le modal candidature, sans ticket encore - const { ModalBuilder, TextInputBuilder, TextInputStyle, ActionRowBuilder } = require('discord.js'); - const questions = require('../commands/ticket/ticket.js').CANDIDATURE_QUESTIONS; - const modal = new ModalBuilder() - .setCustomId('candidature_modal') - .setTitle('Candidature Staff (5 max)'); - for(let i = 0; i < Math.min(questions.length,5); i++) { - const input = new TextInputBuilder() - .setCustomId(`cand_q${i+1}`) - .setLabel(questions[i].slice(0, 45)) - .setStyle(TextInputStyle.Paragraph) - .setRequired(true) - .setMaxLength(1000); - modal.addComponents(new ActionRowBuilder().addComponents(input)); + // 1.A - Création de Ticket (Support, Plainte, etc.) + if (interaction.customId.startsWith('ticket_create_modal_')) { + // On récupère le type depuis l'ID (ex: ticket_create_modal_Support) + const type = interaction.customId.replace('ticket_create_modal_', ''); + await ticketModule.handleCreate(interaction, type); + return; + } + + // 1.B - Candidature Spécifique + if (interaction.customId === 'candidature_modal') { + await ticketModule.handleCandidatureModalSubmit(interaction); + return; + } + + // 1.C - Raison Fermeture + if (interaction.customId === 'ticket_close_reason_modal') { + await ticketModule.handleCloseModal(interaction); + return; + } + + // 1.D - Raison Réouverture + if (interaction.customId === 'ticket_reopen_modal') { + await ticketModule.handleReopenModal(interaction); + return; + } + + // 1.E - Raison Suppression + if (interaction.customId === 'ticket_delete_modal') { + await ticketModule.handleDeleteModal(interaction); + return; + } + } + + // --- 2. GESTION DES BOUTONS (Ouverture des Modals) --- + if (interaction.isButton()) { + const ticketModule = require('../commands/ticket/ticket.js'); + + // 2.A - Bouton Création : On ouvre un MODAL pour tout le monde + if (interaction.customId.startsWith('ticket_create_')) { + + // Cas Spécial : Candidature (Déjà géré avec ses questions spécifiques) + if (interaction.customId === 'ticket_create_candidature') { + const questions = require('../commands/ticket/ticket.js').CANDIDATURE_QUESTIONS; + const modal = new ModalBuilder().setCustomId('candidature_modal').setTitle('Recrutement Staff'); + for(let i=0; i support) + let typeKey = interaction.customId.replace('ticket_create_', ''); + // On remet en joli format (support -> Support, plainte_staff -> Plainte Staff) + const typeMapping = { + 'support': 'Support', + 'plainte': 'Plainte', + 'plainte_staff': 'Plainte Staff', + 'probleme_technique': 'Problème Technique' + }; + const prettyType = typeMapping[typeKey] || 'Support'; + + // On passe le type dans l'ID du modal pour le récupérer au submit + const modal = new ModalBuilder() + .setCustomId(`ticket_create_modal_${prettyType}`) + .setTitle(`Nouveau ticket : ${prettyType}`); + + const subjectInput = new TextInputBuilder() + .setCustomId('ticket_subject') + .setLabel("Sujet / Raison de la demande") + .setStyle(TextInputStyle.Paragraph) + .setRequired(true) + .setMaxLength(1000) + .setPlaceholder("Décrivez brièvement votre problème..."); + + modal.addComponents(new ActionRowBuilder().addComponents(subjectInput)); + await interaction.showModal(modal); + return; + } + + // 2.B - Autres actions (Fermer, Réouvrir, etc.) + if (interaction.customId.startsWith('ticket_close_')) return await ticketModule.handleClose(interaction); + if (interaction.customId.startsWith('ticket_delete_')) return await ticketModule.handleDelete(interaction); + if (interaction.customId.startsWith('ticket_reopen_')) return await ticketModule.handleReopen(interaction); + if (interaction.customId.startsWith('ticket_claim_')) return await ticketModule.handleClaim(interaction); + } + + // --- 3. COMMANDES SLASH --- + if (!interaction.isChatInputCommand()) return; + const command = interaction.client.commands.get(interaction.commandName); + if (!command) { + console.error(chalk.red(`Aucune commande correspondant à ${interaction.commandName} n'a été trouvée.`)); + return; + } + await command.execute(interaction); + + } catch (error) { + console.error(chalk.red(`Erreur lors de l'exécution d'une interaction :`), error); + if (interaction.replied || interaction.deferred) { + await interaction.followUp({ content: 'Une erreur est survenue lors de l\'exécution de cette interaction !', flags: MessageFlags.Ephemeral }); + } else { + await interaction.reply({ content: 'Une erreur est survenue lors de l\'exécution de cette interaction !', flags: MessageFlags.Ephemeral }); + } } - await interaction.showModal(modal); - return; - } - if (interaction.customId.startsWith('ticket_create_')) { - const ticketCommand = interaction.client.commands.get('ticket'); - if (ticketCommand) { - const ticketModule = require('../commands/ticket/ticket.js'); - await ticketModule.handleCreate(interaction); - } - return; - } - - // Fermeture de ticket via bouton - if (interaction.customId.startsWith('ticket_close_')) { - try { - const ticketModule = require('../commands/ticket/ticket.js'); - await ticketModule.handleClose(interaction); - - // Désactiver le bouton après la fermeture - try { - const { ActionRowBuilder, ButtonBuilder } = require('discord.js'); - const oldRow = interaction.message.components[0]; - if (oldRow && oldRow.components.length > 0) { - const newRow = new ActionRowBuilder(); - for (const component of oldRow.components) { - if (component.customId === interaction.customId) { - newRow.addComponents( - ButtonBuilder.from(component).setDisabled(true) - ); - } else { - newRow.addComponents(component); - } - } - await interaction.message.edit({ components: [newRow] }); - } - } catch (buttonErr) { - console.error('⚠️ Erreur lors de la désactivation du bouton:', buttonErr); - } - } catch (err) { - console.error('Erreur lors de la fermeture du ticket via bouton:', err); - if (!interaction.replied && !interaction.deferred) { - await interaction.reply({ - content: '❌ Erreur lors de la fermeture du ticket.', - ephemeral: true - }); - } else { - await interaction.editReply({ - content: '❌ Erreur lors de la fermeture du ticket.' - }); - } - } - return; - } - - // Suppression de ticket via bouton - if (interaction.customId.startsWith('ticket_delete_')) { - try { - const ticketModule = require('../commands/ticket/ticket.js'); - await ticketModule.handleDelete(interaction); - } catch (err) { - console.error('Erreur lors de la suppression du ticket via bouton:', err); - if (!interaction.replied && !interaction.deferred) { - await interaction.reply({ - content: '❌ Erreur lors de la suppression du ticket.', - ephemeral: true - }); - } else { - await interaction.editReply({ - content: '❌ Erreur lors de la suppression du ticket.' - }); - } - } - return; - } - } - - // Gérer les commandes slash - if (!interaction.isChatInputCommand()) return; - - const command = interaction.client.commands.get(interaction.commandName); - - if (!command) { - console.error(chalk.red(`❌ Aucune commande correspondant à ${interaction.commandName} n'a été trouvée.`)); - return; - } - - try { - await command.execute(interaction); - console.log(chalk.green(`✅ ${interaction.user.tag} a utilisé la commande /${interaction.commandName}`)); - } catch (error) { - console.error(chalk.red(`❌ Erreur lors de l'exécution de la commande ${interaction.commandName}:`), error); - - const errorMessage = { - content: '❌ Une erreur est survenue lors de l\'exécution de cette commande !', - ephemeral: true - }; - - if (interaction.replied || interaction.deferred) { - await interaction.followUp(errorMessage).catch(() => null); - } else { - await interaction.reply(errorMessage).catch(() => null); - } - } - }, + }, }; \ No newline at end of file diff --git a/events/messageCreate.js b/events/messageCreate.js index e0c5d8a..ca11499 100644 --- a/events/messageCreate.js +++ b/events/messageCreate.js @@ -1,310 +1,162 @@ -const { Events } = require('discord.js'); +const { Events, EmbedBuilder } = require('discord.js'); const db = require('../functions/database/db.js'); -const { addXP, isChannelExcluded, getUserXP, getXPMultiplier } = require('../functions/xp/xp.js'); +const { addXP, isChannelExcluded, getUserXP, getXPMultiplier, getXPProgress } = require('../functions/xp/xp.js'); +const { colors } = require('../utils/constants'); + +// --- FONCTIONS UTILITAIRES --- -// Fonction pour détecter les bumps (Disboard, etc.) async function detectBump(message) { - // Vérifier si le message vient d'un bot de bump (Disboard, etc.) - // Disboard a l'ID: 302050872383242240 - // On peut aussi détecter par le nom du bot ou le contenu du message - const bumpBots = ['302050872383242240']; // Disboard bot ID - - if (!message.author.bot) return null; - if (!bumpBots.includes(message.author.id)) return null; - - // Détecter les messages de bump (Disboard envoie généralement un embed avec "Bump done!") - const content = message.content?.toLowerCase() || ''; - const hasEmbed = message.embeds.length > 0; - - // Vérifier si c'est un message de bump - // Disboard envoie généralement un embed avec "Bump done!" ou similaire - if (hasEmbed) { - const embed = message.embeds[0]; - const embedDescription = embed.description?.toLowerCase() || ''; - const embedTitle = embed.title?.toLowerCase() || ''; - - // Mots-clés pour détecter un bump - const bumpKeywords = ['bump done', 'bump réussi', 'bump réalisé', 'bump effectué', 'serv bump', 'server bump']; - - const isBumpMessage = bumpKeywords.some(keyword => - embedDescription.includes(keyword) || - embedTitle.includes(keyword) || - content.includes(keyword) - ); - - if (isBumpMessage) { - // Chercher l'utilisateur qui a fait le bump dans les mentions ou dans l'embed - // Disboard mentionne généralement l'utilisateur dans l'embed - let bumpedUserId = null; - - // Essayer de trouver l'utilisateur dans les mentions - if (message.mentions.users.size > 0) { - bumpedUserId = message.mentions.users.first().id; - } - - // Si pas de mention, chercher dans l'embed (format: "User bumped the server!") - if (!bumpedUserId && embedDescription) { - // Chercher un ID utilisateur dans l'embed (format: <@userId>) - const userIdMatch = embedDescription.match(/<@!?(\d+)>/); - if (userIdMatch) { - bumpedUserId = userIdMatch[1]; - } - } - - // Si toujours pas trouvé, chercher dans le footer ou les fields - if (!bumpedUserId && embed.footer) { - const footerMatch = embed.footer.text?.match(/<@!?(\d+)>/); - if (footerMatch) { - bumpedUserId = footerMatch[1]; - } - } - - return bumpedUserId; - } - } - - return null; + const bumpBots = ['302050872383242240']; // Disboard bot ID + if (!message.author.bot || !bumpBots.includes(message.author.id)) return null; + + const content = message.content?.toLowerCase() || ''; + const embed = message.embeds[0]; + if (!embed) return null; + + const embedDescription = embed.description?.toLowerCase() || ''; + const embedTitle = embed.title?.toLowerCase() || ''; + const bumpKeywords = ['bump done', 'bump réussi', 'bump réalisé', 'bump effectué', 'serv bump', 'server bump']; + + const isBumpMessage = bumpKeywords.some(keyword => + embedDescription.includes(keyword) || + embedTitle.includes(keyword) || + content.includes(keyword) + ); + + if (!isBumpMessage) return null; + + // Tentative de récupération de l'ID utilisateur + if (message.mentions.users.size > 0) return message.mentions.users.first().id; + + const userIdMatch = embedDescription.match(/<@!?(\d+)>/); + if (userIdMatch) return userIdMatch[1]; + + if (embed.footer) { + const footerMatch = embed.footer.text?.match(/<@!?(\d+)>/); + if (footerMatch) return footerMatch[1]; + } + + return null; } -// Fonction pour détecter les messages de bienvenue function detectWelcomeMessage(message) { - // Ignorer les bots - if (message.author.bot) return false; - - // Mots-clés pour détecter les messages de bienvenue - const welcomeKeywords = ['bienvenue', 'welcome', 'bvn', 'salut', 'hey', 'bonjour']; - const content = message.content.toLowerCase(); - - // Vérifier si le message contient un mot de bienvenue - const hasWelcomeKeyword = welcomeKeywords.some(keyword => content.includes(keyword)); - - // Vérifier si le message mentionne un utilisateur (généralement pour accueillir quelqu'un) - const hasMention = message.mentions.users.size > 0; - - // Vérifier si le message est assez court (pour éviter les faux positifs) - const isShortMessage = message.content.length < 100; - - return hasWelcomeKeyword && hasMention && isShortMessage; + if (message.author.bot) return false; + const welcomeKeywords = ['bienvenue', 'welcome', 'bvn', 'salut', 'hey', 'bonjour']; + const content = message.content.toLowerCase(); + + return welcomeKeywords.some(k => content.includes(k)) && + message.mentions.users.size > 0 && + message.content.length < 100; } +async function handleLevelUp(message, result, member) { + if (!result || !result.levelUp) return; + + const progress = getXPProgress(result.newXP, result.newLevel); + const embed = new EmbedBuilder() + .setTitle('🎉 Level Up !') + .setDescription(`Félicitations ${member.toString()} ! Tu as atteint le niveau **${result.newLevel}** !`) + .setColor(colors.success) + .addFields( + { name: '📊 XP', value: `${result.newXP} XP`, inline: true }, + { name: '⭐ Niveau', value: `${result.newLevel}`, inline: true }, + { name: '📈 Progression', value: `${progress.current}/${progress.needed} XP (${progress.percentage}%)`, inline: true } + ) + .setThumbnail(member.user.displayAvatarURL({ dynamic: true })) + .setTimestamp(); + + await message.channel.send({ embeds: [embed] }); +} + +// --- LOGIQUE PRINCIPALE --- + module.exports = { - name: Events.MessageCreate, - async execute(message) { - // Ignorer les messages qui ne sont pas dans un canal de texte - if (!message.channel.isTextBased() || message.channel.isDMBased()) return; + name: Events.MessageCreate, + async execute(message) { + if (!message.channel.isTextBased() || message.channel.isDMBased()) return; - try { - // Détecter les bumps (AVANT d'ignorer les bots, car Disboard est un bot) - const bumpedUserId = await detectBump(message); - if (bumpedUserId) { - try { - // Enregistrer le bump dans la DB - await db.query( - 'INSERT INTO bumps (userId, guildId, bumpTime, reminderSent) VALUES (?, ?, ?, ?)', - [bumpedUserId, message.guild.id, Date.now(), false] - ); - - // Donner de l'XP pour le bump - const member = await message.guild.members.fetch(bumpedUserId).catch(() => null); - if (member) { - const multiplier = getXPMultiplier(member); - // Gain d'XP pour bump : 50-100 XP (plus que les messages normaux) - const xpGained = Math.floor(Math.random() * 51) + 50; // 50-100 XP - const result = await addXP(bumpedUserId, message.guild.id, xpGained, 'bump', multiplier); - - if (result && result.levelUp) { - const { EmbedBuilder } = require('discord.js'); - const { colors } = require('../utils/constants'); - const { getXPProgress } = require('../functions/xp/xp.js'); - - const progress = getXPProgress(result.newXP, result.newLevel); - - const embed = new EmbedBuilder() - .setTitle('🎉 Level Up !') - .setDescription(`Félicitations ${member.toString()} ! Tu as atteint le niveau **${result.newLevel}** !`) - .setColor(colors.success) - .addFields( - { name: '📊 XP', value: `${result.newXP} XP`, inline: true }, - { name: '⭐ Niveau', value: `${result.newLevel}`, inline: true }, - { name: '📈 Progression', value: `${progress.current}/${progress.needed} XP (${progress.percentage}%)`, inline: true } - ) - .setThumbnail(member.user.displayAvatarURL({ dynamic: true })) - .setTimestamp(); - - await message.channel.send({ embeds: [embed] }); - } - } - - // Le reminder sera géré automatiquement par bumpReminder.js (vérifie toutes les minutes) - // Pas besoin de setTimeout ici, le système de reminder s'en occupe - - } catch (err) { - console.error('Erreur lors de la détection du bump:', err); - } - - // Ne pas continuer le traitement pour les messages de bump - return; - } + try { + // 1. GESTION DES BUMPS + const bumpedUserId = await detectBump(message); + if (bumpedUserId) { + try { + await db.query('INSERT INTO bumps (userId, guildId, bumpTime, reminderSent) VALUES (?, ?, ?, ?)', [bumpedUserId, message.guild.id, Date.now(), false]); + + const member = await message.guild.members.fetch(bumpedUserId).catch(() => null); + if (member) { + const xpGained = Math.floor(Math.random() * 51) + 50; // 50-100 XP + const result = await addXP(bumpedUserId, message.guild.id, xpGained, 'bump', getXPMultiplier(member)); + await handleLevelUp(message, result, member); + } + } catch (err) { console.error('Erreur bump:', err); } + return; + } - // Ignorer les messages du bot (après la détection des bumps) - if (message.author.bot) return; - // Vérifier si ce canal est un ticket (logique existante pour les tickets) - const [tickets] = await db.query( - 'SELECT * FROM tickets WHERE channelId = ? AND status = ?', - [message.channel.id, 'Ouvert'] - ); + // 2. IGNORER LES BOTS (Sauf pour les bumps traités au-dessus) + if (message.author.bot) return; - if (tickets.length > 0) { - // C'est un ticket, traiter la logique des tickets - const ticket = tickets[0]; + // 3. GESTION DES TICKETS + const [tickets] = await db.query('SELECT * FROM tickets WHERE channelId = ? AND status = ?', [message.channel.id, 'Ouvert']); + if (tickets.length > 0) { + const ticket = tickets[0]; + const attachments = message.attachments.size > 0 ? message.attachments.map(a => a.url).join(', ') : null; + + const maxTag = 100; + const maxText = 65535; + const safeUserTag = (message.author.tag && message.author.tag.length > maxTag) ? message.author.tag.substring(0, maxTag) : message.author.tag; + const safeContent = (message.content && message.content.length > maxText) ? message.content.substring(0, maxText) : message.content; + const safeAttachments = (attachments && attachments.length > maxText) ? attachments.substring(0, maxText) : attachments; - // Enregistrer le message dans la DB - const attachments = message.attachments.size > 0 - ? message.attachments.map(a => a.url).join(', ') - : null; + await db.query( + `INSERT INTO ticket_messages (ticketId, messageId, userId, userTag, content, attachments, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?)`, + [ticket.ticketId, message.id, message.author.id, safeUserTag, safeContent || null, safeAttachments, message.createdTimestamp] + ); + return; // Pas d'XP dans les tickets + } -// Troncature des champs pour respecter les limites SQL -const maxTag = 100; -const maxText = 65535; -const safeUserTag = (message.author.tag && message.author.tag.length > maxTag) ? message.author.tag.substring(0, maxTag) : message.author.tag; -const safeContent = (message.content && message.content.length > maxText) ? message.content.substring(0, maxText) : message.content; -const safeAttachments = (attachments && attachments.length > maxText) ? attachments.substring(0, maxText) : attachments; -await db.query( - `INSERT INTO ticket_messages (ticketId, messageId, userId, userTag, content, attachments, timestamp) - VALUES (?, ?, ?, ?, ?, ?, ?)`, - [ - ticket.ticketId, - message.id, - message.author.id, - safeUserTag, - safeContent || null, - safeAttachments, - message.createdTimestamp - ] -); + // 4. SYSTÈME D'XP (Messages normaux) + const excluded = await isChannelExcluded(message.channel.id, message.guild.id); + if (!excluded) { + const userXP = await getUserXP(message.author.id, message.guild.id); + const now = Date.now(); + const cooldown = 15000; // 15s + + let lastMessageTime = parseInt(userXP.lastMessageTime || 0, 10); + // Reset si date invalide + if (lastMessageTime > now || lastMessageTime < (now - 31536000000)) lastMessageTime = 0; + if (lastMessageTime === 0 || (now - lastMessageTime) >= cooldown) { + const member = await message.guild.members.fetch(message.author.id).catch(() => null); + const xpGained = Math.floor(Math.random() * 11) + 15; // 15-25 XP + + const result = await addXP(message.author.id, message.guild.id, xpGained, 'message', member ? getXPMultiplier(member) : 1.0); + if (member) await handleLevelUp(message, result, member); - // Ne pas donner d'XP dans les tickets - return; - } + // Mise à jour stats + timestamp + await db.query('UPDATE user_xp SET lastMessageTime = ?, totalMessages = totalMessages + 1 WHERE userId = ? AND guildId = ?', [now, message.author.id, message.guild.id]); + } else { + // Juste incrémenter le compteur de messages (Cooldown actif) + await db.query('UPDATE user_xp SET totalMessages = totalMessages + 1 WHERE userId = ? AND guildId = ?', [message.author.id, message.guild.id]); + } + } - // Système XP : Gagner de l'XP pour les messages (pas dans les tickets) - // Vérifier si le salon est exclus de l'XP - const excluded = await isChannelExcluded(message.channel.id, message.guild.id); - - if (!excluded) { - // Récupérer les données de l'utilisateur - const userXP = await getUserXP(message.author.id, message.guild.id); - - // Cooldown : 15 secondes entre chaque gain d'XP par message - const cooldown = 15 * 1000; // 15 secondes - const now = Date.now(); - - // Convertir lastMessageTime en nombre (peut être string depuis la DB) - let lastMessageTime = 0; - if (userXP.lastMessageTime) { - lastMessageTime = parseInt(userXP.lastMessageTime, 10); - // Si lastMessageTime est dans le futur (erreur de données) ou trop ancien (plus de 1 an), on le réinitialise - if (lastMessageTime > now || lastMessageTime < (now - 365 * 24 * 60 * 60 * 1000)) { - lastMessageTime = 0; - } - } - - const timeSinceLastMessage = now - lastMessageTime; - - // Si lastMessageTime est 0 (premier message) ou si le cooldown est passé - if (lastMessageTime === 0 || timeSinceLastMessage >= cooldown) { - // Récupérer le membre pour calculer le multiplicateur - const member = await message.guild.members.fetch(message.author.id).catch(() => null); - const multiplier = member ? getXPMultiplier(member) : 1.0; - - // Gain d'XP : 15-25 XP aléatoire par message - const xpGained = Math.floor(Math.random() * 11) + 15; // 15-25 XP - - // Ajouter l'XP - const result = await addXP(message.author.id, message.guild.id, xpGained, 'message', multiplier); - - if (result && result.levelUp) { - // Niveau supérieur atteint ! - const { EmbedBuilder } = require('discord.js'); - const { colors } = require('../utils/constants'); - const { getXPProgress } = require('../functions/xp/xp.js'); - - const progress = getXPProgress(result.newXP, result.newLevel); - - const embed = new EmbedBuilder() - .setTitle('🎉 Level Up !') - .setDescription(`Félicitations ${message.author.toString()} ! Tu as atteint le niveau **${result.newLevel}** !`) - .setColor(colors.success) - .addFields( - { name: '📊 XP', value: `${result.newXP} XP`, inline: true }, - { name: '⭐ Niveau', value: `${result.newLevel}`, inline: true }, - { name: '📈 Progression', value: `${progress.current}/${progress.needed} XP (${progress.percentage}%)`, inline: true } - ) - .setThumbnail(message.author.displayAvatarURL({ dynamic: true })) - .setTimestamp(); - - await message.channel.send({ embeds: [embed] }); - } - - // Mettre à jour lastMessageTime et totalMessages (AVANT le gain d'XP pour éviter les problèmes) - await db.query( - 'UPDATE user_xp SET lastMessageTime = ?, totalMessages = totalMessages + 1 WHERE userId = ? AND guildId = ?', - [now, message.author.id, message.guild.id] - ); - } else { - // Cooldown actif, mettre à jour seulement totalMessages (sans XP) - await db.query( - 'UPDATE user_xp SET totalMessages = totalMessages + 1 WHERE userId = ? AND guildId = ?', - [message.author.id, message.guild.id] - ); - } - } + // 5. MESSAGES DE BIENVENUE + if (detectWelcomeMessage(message)) { + try { + await message.react('👋').catch(() => null); + await message.react('🎉').catch(() => null); - // Détecter les messages de bienvenue - if (detectWelcomeMessage(message)) { - try { - // Réagir avec un emoji de bienvenue - await message.react('👋').catch(() => null); - await message.react('🎉').catch(() => null); - - // Donner de l'XP pour avoir dit bienvenue - const member = await message.guild.members.fetch(message.author.id).catch(() => null); - if (member) { - const multiplier = getXPMultiplier(member); - // Gain d'XP pour bienvenue : 20-40 XP - const xpGained = Math.floor(Math.random() * 21) + 20; // 20-40 XP - const result = await addXP(message.author.id, message.guild.id, xpGained, 'welcome', multiplier); - - if (result && result.levelUp) { - const { EmbedBuilder } = require('discord.js'); - const { colors } = require('../utils/constants'); - const { getXPProgress } = require('../functions/xp/xp.js'); - - const progress = getXPProgress(result.newXP, result.newLevel); - - const embed = new EmbedBuilder() - .setTitle('🎉 Level Up !') - .setDescription(`Félicitations ${message.author.toString()} ! Tu as atteint le niveau **${result.newLevel}** !`) - .setColor(colors.success) - .addFields( - { name: '📊 XP', value: `${result.newXP} XP`, inline: true }, - { name: '⭐ Niveau', value: `${result.newLevel}`, inline: true }, - { name: '📈 Progression', value: `${progress.current}/${progress.needed} XP (${progress.percentage}%)`, inline: true } - ) - .setThumbnail(message.author.displayAvatarURL({ dynamic: true })) - .setTimestamp(); - - await message.channel.send({ embeds: [embed] }); - } - } - } catch (err) { - console.error('Erreur lors de la détection du message de bienvenue:', err); - } - } + const member = await message.guild.members.fetch(message.author.id).catch(() => null); + if (member) { + const xpGained = Math.floor(Math.random() * 21) + 20; // 20-40 XP + const result = await addXP(message.author.id, message.guild.id, xpGained, 'welcome', getXPMultiplier(member)); + await handleLevelUp(message, result, member); + } + } catch (err) { console.error('Erreur bienvenue:', err); } + } - } catch (err) { - console.error('Erreur lors de l\'enregistrement du message:', err); - } - }, -}; + } catch (err) { + console.error('Erreur globale messageCreate:', err); + } + }, +}; \ No newline at end of file diff --git a/events/ready.js b/events/ready.js index f13aa0c..312408a 100644 --- a/events/ready.js +++ b/events/ready.js @@ -10,6 +10,13 @@ module.exports = { console.log(chalk.blue(`🔧 ${client.commands.size} commande(s) chargée(s)`)); // Statut du bot - client.user.setActivity('France Femboy', { type: ActivityType.Watching }); + client.user.setPresence({ + activities: [{ + name: 'Surveille le discord Femboy Croissant 👀', + type: ActivityType.Streaming, + url: 'https://twitch.tv/femboycroissantoff' + }], + status: 'online' + }); }, }; \ No newline at end of file diff --git a/events/voiceStateUpdate.js b/events/voiceStateUpdate.js index 3f20b7b..99ba83e 100644 --- a/events/voiceStateUpdate.js +++ b/events/voiceStateUpdate.js @@ -1,234 +1,143 @@ /** * Gestion de l'XP vocal * Gain d'XP toutes les 10 minutes en vocal (5-25 XP) + * - Timer ne démarre QUE si au moins 2 personnes dans le salon + * - Timer s'arrête si l'utilisateur est mute/deafen + * - totalVoiceTime est incrémenté chaque minute */ -const { Events } = require('discord.js'); +const { Events, EmbedBuilder } = require('discord.js'); const db = require('../functions/database/db.js'); -const { addXP, getUserXP, getXPMultiplier } = require('../functions/xp/xp.js'); +const { addXP, getXPMultiplier, getXPProgress } = require('../functions/xp/xp.js'); +const { colors } = require('../utils/constants'); -// Stocker les utilisateurs en vocal par serveur -const voiceUsers = new Map(); // Map +// Map +const voiceUsers = new Map(); + +function canGainXP(member) { + if (!member || !member.voice.channelId) return false; + const voiceChannel = member.voice.channel; + if (!voiceChannel) return false; + + // Compter les humains + const membersInChannel = voiceChannel.members.filter(m => !m.user.bot).size; + + // Conditions : Pas tout seul, pas mute, pas deaf + const isAlone = membersInChannel < 2; + const isMuted = member.voice.serverMute || member.voice.selfMute; + const isDeafened = member.voice.serverDeaf || member.voice.selfDeaf; + + return !isAlone && !isMuted && !isDeafened; +} + +async function startTimers(key, member, guildId, userId) { + // Si déjà des timers, on ne fait rien + if (voiceUsers.has(key)) return; + + // 1. Timer XP (10 min) + const xpInterval = setInterval(async () => { + try { + // Re-vérification dynamique + const currentMember = await member.guild.members.fetch(userId).catch(() => null); + if (!currentMember || !canGainXP(currentMember)) return; + + const multiplier = getXPMultiplier(currentMember, 'voice'); + const xpGained = Math.floor(Math.random() * 21) + 5; // 5-25 XP + const result = await addXP(userId, guildId, xpGained, 'voice', multiplier); + + if (result && result.levelUp) { + const progress = getXPProgress(result.newXP, result.newLevel); + const embed = new EmbedBuilder() + .setTitle('🎉 Level Up !') + .setDescription(`Félicitations ${currentMember.toString()} ! Tu as atteint le niveau **${result.newLevel}** en vocal !`) + .setColor(colors.success) + .addFields( + { name: '📊 XP', value: `${result.newXP} XP`, inline: true }, + { name: '⭐ Niveau', value: `${result.newLevel}`, inline: true }, + { name: '📈 Progression', value: `${progress.current}/${progress.needed} XP (${progress.percentage}%)`, inline: true } + ) + .setThumbnail(currentMember.user.displayAvatarURL({ dynamic: true })) + .setTimestamp(); + + const systemChannel = member.guild.systemChannel; + if (systemChannel) await systemChannel.send({ embeds: [embed] }).catch(() => null); + } + } catch (err) { console.error('Erreur Timer XP:', err); } + }, 10 * 60 * 1000); + + // 2. Timer Temps (1 min) + const timeInterval = setInterval(async () => { + try { + const currentMember = await member.guild.members.fetch(userId).catch(() => null); + if (currentMember && canGainXP(currentMember)) { + await db.query('UPDATE user_xp SET totalVoiceTime = totalVoiceTime + 1 WHERE userId = ? AND guildId = ?', [userId, guildId]); + } + } catch (err) { console.error('Erreur Timer Temps:', err); } + }, 60 * 1000); + + voiceUsers.set(key, { xpInterval, timeInterval }); + + // Mise à jour lastVoiceJoin + await db.query('UPDATE user_xp SET lastVoiceJoin = ? WHERE userId = ? AND guildId = ?', [Date.now(), userId, guildId]).catch(() => {}); +} + +function stopTimers(key) { + const userData = voiceUsers.get(key); + if (userData) { + clearInterval(userData.xpInterval); + clearInterval(userData.timeInterval); + voiceUsers.delete(key); + } +} + +async function updateState(member) { + if (!member || member.user.bot) return; + + const guildId = member.guild.id; + const userId = member.id; + const key = `${guildId}_${userId}`; + + if (canGainXP(member)) { + await startTimers(key, member, guildId, userId); + } else { + stopTimers(key); + } +} + +async function checkChannel(channel) { + if (!channel) return; + // Vérifier tous les membres du salon car l'arrivée/départ de quelqu'un change le statut "isAlone" + for (const [id, member] of channel.members) { + await updateState(member); + } +} module.exports = { - name: Events.VoiceStateUpdate, - async execute(oldState, newState) { - const userId = newState.member?.id || oldState.member?.id; - const guildId = newState.guild?.id || oldState.guild?.id; - - if (!userId || !guildId) return; - - // Ignorer les bots - if (newState.member?.user.bot || oldState.member?.user.bot) return; - - const key = `${guildId}_${userId}`; - - // Utilisateur rejoint un canal vocal - if (!oldState.channelId && newState.channelId) { - // L'utilisateur a rejoint un canal vocal - const joinTime = Date.now(); - - // Mettre à jour lastVoiceJoin dans la DB - await db.query( - 'UPDATE user_xp SET lastVoiceJoin = ? WHERE userId = ? AND guildId = ?', - [joinTime, userId, guildId] - ).catch(() => { - // L'utilisateur n'existe pas encore, on le créera lors du premier gain d'XP - }); - - // Créer un interval pour gagner de l'XP toutes les 10 minutes - const interval = setInterval(async () => { - try { - // Récupérer le serveur et le membre - const guild = newState.guild || oldState.guild; - if (!guild) { - clearInterval(interval); - voiceUsers.delete(key); - return; - } - - const member = await guild.members.fetch(userId).catch(() => null); - if (!member || !member.voice.channelId) { - // L'utilisateur n'est plus en vocal, arrêter l'interval - clearInterval(interval); - voiceUsers.delete(key); - return; - } - - // Vérifier si l'utilisateur est seul (anti-farming ultra strict) - // Ne pas donner d'XP si l'utilisateur est seul dans le salon (peu importe s'il est muet ou non) - const voiceChannel = member.voice.channel; - if (voiceChannel) { - // Compter le nombre de membres dans le salon (sans les bots) - const membersInChannel = voiceChannel.members.filter(m => !m.user.bot).size; - const isAlone = membersInChannel === 1; // Seul dans le salon - - // Si l'utilisateur est seul, ne pas donner d'XP (anti-farming ultra strict) - if (isAlone) { - // Ne pas donner d'XP mais continuer le timer (il pourra gagner de l'XP si quelqu'un le rejoint) - return; - } - } - - // Récupérer le multiplicateur (avec source='voice' pour le bonus vocal) - const multiplier = getXPMultiplier(member, 'voice'); - - // Gain d'XP vocal : 5-25 XP toutes les 10 minutes - const xpGained = Math.floor(Math.random() * 21) + 5; // 5-25 XP - - // Ajouter l'XP - const result = await addXP(userId, guildId, xpGained, 'voice', multiplier); - - if (result) { - // Mettre à jour totalVoiceTime (en minutes) - await db.query( - 'UPDATE user_xp SET totalVoiceTime = totalVoiceTime + 10 WHERE userId = ? AND guildId = ?', - [userId, guildId] - ); - - // Si niveau supérieur, envoyer un message (optionnel, on peut le désactiver pour éviter le spam) - if (result.levelUp) { - const { EmbedBuilder } = require('discord.js'); - const { colors } = require('../utils/constants'); - const { getXPProgress } = require('../functions/xp/xp.js'); - - const progress = getXPProgress(result.newXP, result.newLevel); - - const embed = new EmbedBuilder() - .setTitle('🎉 Level Up !') - .setDescription(`Félicitations ${member.toString()} ! Tu as atteint le niveau **${result.newLevel}** en vocal !`) - .setColor(colors.success) - .addFields( - { name: '📊 XP', value: `${result.newXP} XP`, inline: true }, - { name: '⭐ Niveau', value: `${result.newLevel}`, inline: true }, - { name: '📈 Progression', value: `${progress.current}/${progress.needed} XP (${progress.percentage}%)`, inline: true } - ) - .setThumbnail(member.user.displayAvatarURL({ dynamic: true })) - .setTimestamp(); - - // Envoyer dans le canal système (si disponible) - const systemChannel = guild.systemChannel; - if (systemChannel) { - await systemChannel.send({ embeds: [embed] }).catch(() => null); - } - } - } - } catch (err) { - console.error('Erreur lors du gain d\'XP vocal:', err); - } - }, 10 * 60 * 1000); // 10 minutes - - voiceUsers.set(key, { joinTime, interval }); - } - - // Utilisateur quitte un canal vocal - if (oldState.channelId && !newState.channelId) { - // L'utilisateur a quitté le canal vocal - const userData = voiceUsers.get(key); - if (userData) { - clearInterval(userData.interval); - voiceUsers.delete(key); - - // Calculer le temps passé en vocal et mettre à jour totalVoiceTime - const timeSpent = Math.floor((Date.now() - userData.joinTime) / 1000 / 60); // en minutes - if (timeSpent > 0) { - await db.query( - 'UPDATE user_xp SET totalVoiceTime = totalVoiceTime + ? WHERE userId = ? AND guildId = ?', - [timeSpent, userId, guildId] - ).catch(() => null); - } - } - } - - // Utilisateur change de canal vocal - if (oldState.channelId && newState.channelId && oldState.channelId !== newState.channelId) { - // L'utilisateur a changé de canal vocal - // On récupère les données existantes et on met à jour le joinTime - const userData = voiceUsers.get(key); - if (userData) { - // Mettre à jour le joinTime pour le nouveau canal - userData.joinTime = Date.now(); - // L'interval continue, pas besoin de le redémarrer - } else { - // Si pour une raison quelconque les données n'existent pas, créer un nouvel interval - // (ce cas ne devrait normalement pas arriver) - const joinTime = Date.now(); - await db.query( - 'UPDATE user_xp SET lastVoiceJoin = ? WHERE userId = ? AND guildId = ?', - [joinTime, userId, guildId] - ).catch(() => null); - - const interval = setInterval(async () => { - try { - const guild = newState.guild || oldState.guild; - if (!guild) { - clearInterval(interval); - voiceUsers.delete(key); - return; - } - - const member = await guild.members.fetch(userId).catch(() => null); - if (!member || !member.voice.channelId) { - clearInterval(interval); - voiceUsers.delete(key); - return; - } - - // Vérifier si l'utilisateur est seul (anti-farming ultra strict) - const voiceChannel = member.voice.channel; - if (voiceChannel) { - const membersInChannel = voiceChannel.members.filter(m => !m.user.bot).size; - const isAlone = membersInChannel === 1; - - // Si l'utilisateur est seul, ne pas donner d'XP - if (isAlone) { - return; - } - } - - const multiplier = getXPMultiplier(member, 'voice'); - const xpGained = Math.floor(Math.random() * 21) + 5; - const result = await addXP(userId, guildId, xpGained, 'voice', multiplier); - - if (result) { - await db.query( - 'UPDATE user_xp SET totalVoiceTime = totalVoiceTime + 10 WHERE userId = ? AND guildId = ?', - [userId, guildId] - ); - - if (result.levelUp) { - const { EmbedBuilder } = require('discord.js'); - const { colors } = require('../utils/constants'); - const { getXPProgress } = require('../functions/xp/xp.js'); - - const progress = getXPProgress(result.newXP, result.newLevel); - - const embed = new EmbedBuilder() - .setTitle('🎉 Level Up !') - .setDescription(`Félicitations ${member.toString()} ! Tu as atteint le niveau **${result.newLevel}** en vocal !`) - .setColor(colors.success) - .addFields( - { name: '📊 XP', value: `${result.newXP} XP`, inline: true }, - { name: '⭐ Niveau', value: `${result.newLevel}`, inline: true }, - { name: '📈 Progression', value: `${progress.current}/${progress.needed} XP (${progress.percentage}%)`, inline: true } - ) - .setThumbnail(member.user.displayAvatarURL({ dynamic: true })) - .setTimestamp(); - - const systemChannel = guild.systemChannel; - if (systemChannel) { - await systemChannel.send({ embeds: [embed] }).catch(() => null); - } - } - } - } catch (err) { - console.error('Erreur lors du gain d\'XP vocal:', err); - } - }, 10 * 60 * 1000); - - voiceUsers.set(key, { joinTime, interval }); - } - } - }, -}; - + name: Events.VoiceStateUpdate, + async execute(oldState, newState) { + try { + // Cas 1: Join + if (!oldState.channelId && newState.channelId) { + await checkChannel(newState.channel); + } + // Cas 2: Leave + else if (oldState.channelId && !newState.channelId) { + const member = oldState.member; + const key = `${member.guild.id}_${member.id}`; + stopTimers(key); // Arrêt immédiat pour celui qui part + await checkChannel(oldState.channel); // Vérif pour ceux qui restent + } + // Cas 3: Move + else if (oldState.channelId && newState.channelId && oldState.channelId !== newState.channelId) { + await checkChannel(oldState.channel); + await checkChannel(newState.channel); + } + // Cas 4: Mute/Deaf update (Même channel) + else if (oldState.channelId === newState.channelId) { + await updateState(newState.member); + } + } catch (err) { + console.error('Erreur VoiceStateUpdate:', err); + } + }, +}; \ No newline at end of file diff --git a/functions/bump/bumpReminder.js b/functions/bump/bumpReminder.js index 4e9d552..5760e21 100644 --- a/functions/bump/bumpReminder.js +++ b/functions/bump/bumpReminder.js @@ -4,85 +4,53 @@ */ const chalk = require('chalk'); +const { EmbedBuilder } = require('discord.js'); +const { colors } = require('../../utils/constants'); module.exports = (client, db) => { - setInterval(async () => { - try { - const now = Date.now(); - // Récupérer les bumps qui ont besoin d'un reminder (2h après, avec une fenêtre de 1 minute) - const twoHours = 2 * 60 * 60 * 1000; - const oneMinute = 60 * 1000; - - const [bumps] = await db.query( - 'SELECT * FROM bumps WHERE reminderSent = ? AND bumpTime <= ? AND bumpTime >= ?', - [false, now - twoHours + oneMinute, now - twoHours - oneMinute] - ); - - if (!bumps.length) return; - - for (const bump of bumps) { - try { - const guild = client.guilds.cache.get(bump.guildId); - if (!guild) { - console.warn(chalk.yellow(`⚠️ Impossible d'envoyer le reminder de bump: le bot n'est pas dans la guild ${bump.guildId}`)); - continue; - } - - const member = await guild.members.fetch(bump.userId).catch(() => null); - if (!member) { - console.warn(chalk.yellow(`⚠️ Utilisateur ${bump.userId} introuvable dans la guild ${guild.id}`)); - continue; - } - - // Trouver le canal de bump (ou utiliser le canal système) - // On cherche dans les canaux de bump configurés, sinon on utilise le canal système - const [bumpChannels] = await db.query( - 'SELECT * FROM bump_channels WHERE guildId = ?', - [bump.guildId] - ); - - let channel = null; - if (bumpChannels.length > 0) { - // Utiliser le premier canal de bump configuré - channel = guild.channels.cache.get(bumpChannels[0].channelId); - } - - // Si pas de canal de bump configuré, utiliser le canal système - if (!channel) { - channel = guild.systemChannel; - } - - if (!channel) { - console.warn(chalk.yellow(`⚠️ Aucun canal disponible pour envoyer le reminder de bump dans la guild ${guild.id}`)); - continue; - } - - const { EmbedBuilder } = require('discord.js'); - const { colors } = require('../../utils/constants'); - - const reminderEmbed = new EmbedBuilder() - .setTitle('⏰ Rappel de Bump') - .setDescription(`${member.toString()}, tu peux maintenant refaire un bump !`) - .setColor(colors.info) - .setFooter({ text: 'Utilise /bump (Disboard) pour bump le serveur • /bumptime pour vérifier' }) - .setTimestamp(); - - await channel.send({ embeds: [reminderEmbed] }); - - // Marquer le reminder comme envoyé - await db.query( - 'UPDATE bumps SET reminderSent = ? WHERE id = ?', - [true, bump.id] - ); - - console.log(chalk.green(`✅ Reminder de bump envoyé à ${member.user.tag} dans la guild ${guild.name}`)); - } catch (err) { - console.error(chalk.red(`❌ Erreur lors de l'envoi du reminder de bump ${bump.id}:`), err); - } - } - } catch (err) { - console.error(chalk.red('❌ Erreur lors de la vérification des reminders de bump:'), err); - } - }, 60 * 1000); // Vérifier toutes les minutes -}; - + setInterval(async () => { + try { + const now = Date.now(); + const twoHours = 2 * 60 * 60 * 1000; + + // Récupérer tous les bumps de plus de 2h qui n'ont pas encore eu de rappel + const [bumps] = await db.query( + 'SELECT * FROM bumps WHERE reminderSent = ? AND bumpTime <= ?', + [false, now - twoHours] + ); + + if (!bumps.length) return; + + for (const bump of bumps) { + try { + const guild = client.guilds.cache.get(bump.guildId); + if (!guild) continue; + + const member = await guild.members.fetch(bump.userId).catch(() => null); + if (!member) continue; + + const [bumpChannels] = await db.query('SELECT * FROM bump_channels WHERE guildId = ?', [bump.guildId]); + let channel = bumpChannels.length > 0 ? guild.channels.cache.get(bumpChannels[0].channelId) : guild.systemChannel; + + if (!channel) continue; + + const reminderEmbed = new EmbedBuilder() + .setTitle('⏰ Rappel de Bump') + .setDescription(`${member.toString()}, tu peux maintenant refaire un bump !`) + .setColor(colors.info) + .setFooter({ text: 'Utilise /bump (Disboard) pour bump le serveur • /bumptime pour vérifier' }) + .setTimestamp(); + + await channel.send({ embeds: [reminderEmbed] }); + + await db.query('UPDATE bumps SET reminderSent = ? WHERE id = ?', [true, bump.id]); + console.log(chalk.green(`✅ Reminder de bump envoyé à ${member.user.tag} dans la guild ${guild.name}`)); + } catch (err) { + console.error(chalk.red(`❌ Erreur reminder bump ${bump.id}:`), err); + } + } + } catch (err) { + console.error(chalk.red('❌ Erreur vérification reminders bump:'), err); + } + }, 60 * 1000); +}; \ No newline at end of file diff --git a/functions/database/db.js b/functions/database/db.js index 07221a7..894c088 100644 --- a/functions/database/db.js +++ b/functions/database/db.js @@ -1,10 +1,10 @@ const mysql = require('mysql2/promise'); const pool = mysql.createPool({ - host: process.env.DB_HOST || '192.168.1.6', - user: process.env.DB_USER || 'bot', - password: process.env.DB_PASSWORD || 'NxKr63LJB65pHv%t7E$JqgxKRsZMw%VIHEZAjq%^O0KYKjW#cRc^ebIH@%S9kaTh*GIg^D3ai4KBjMeXEh6xwv#9afQIR2$!2UB8C3ToXjnYFmzR%$lfpshnf8g@8229', - database: process.env.DB_NAME || 'bot', + host: process.env.DB_HOST || '192.168.1.6', + user: process.env.DB_USER || 'bot', + password: process.env.DB_PASSWORD || 'NxKr63LJB65pHv%t7E$JqgxKRsZMw%VIHEZAjq%^O0KYKjW#cRc^ebIH@%S9kaTh*GIg^D3ai4KBjMeXEh6xwv#9afQIR2$!2UB8C3ToXjnYFmzR%$lfpshnf8g@8229', + database: process.env.DB_NAME || 'bot', waitForConnections: true, connectionLimit: 10, queueLimit: 0 @@ -13,28 +13,20 @@ const pool = mysql.createPool({ async function initDB() { const conn = await pool.getConnection(); try { + // Tables de modération await conn.query(` CREATE TABLE IF NOT EXISTS bans ( - userId VARCHAR(32), - guildId VARCHAR(32), + userId VARCHAR(32), + guildId VARCHAR(32), reason TEXT, modId VARCHAR(32), timestamp BIGINT, type VARCHAR(20) NOT NULL, - unbanDate BIGINT, - PRIMARY KEY (userId, guildId) - ) + unbanDate BIGINT, + PRIMARY KEY (userId, guildId) + ) `); - // Ajouter la colonne guildId si elle n'existe pas (migration) - try { - await conn.query('ALTER TABLE bans ADD COLUMN guildId VARCHAR(32)'); - await conn.query('ALTER TABLE bans DROP PRIMARY KEY'); - await conn.query('ALTER TABLE bans ADD PRIMARY KEY (userId, guildId)'); - } catch { - // La colonne existe déjà, on continue - } - await conn.query(` CREATE TABLE IF NOT EXISTS logs ( id INT AUTO_INCREMENT PRIMARY KEY, @@ -42,231 +34,203 @@ async function initDB() { userTag VARCHAR(100), modId VARCHAR(32), modTag VARCHAR(100), - action VARCHAR(50), + action VARCHAR(50), reason TEXT, type ENUM('Permanent','Temporary') DEFAULT 'Permanent', - guildId VARCHAR(32), - timestamp BIGINT - ) - `); - - // Ajouter la colonne guildId si elle n'existe pas (migration) - try { - await conn.query('ALTER TABLE logs ADD COLUMN guildId VARCHAR(32)'); - } catch { - // La colonne existe déjà, on continue - } - - // Agrandir la colonne action si elle est trop petite (migration) - try { - await conn.query('ALTER TABLE logs MODIFY COLUMN action VARCHAR(50)'); - } catch { - // La colonne est déjà de la bonne taille ou n'existe pas, on continue - } - - // Table pour les mutes - await conn.query(` - CREATE TABLE IF NOT EXISTS mutes ( - userId VARCHAR(32), - guildId VARCHAR(32), - reason TEXT, - modId VARCHAR(32), - modTag VARCHAR(100), - timestamp BIGINT, - unmuteDate BIGINT, - type VARCHAR(20) NOT NULL, - PRIMARY KEY (userId, guildId) - ) - `); - - // Table pour les messages de ban personnalisés - await conn.query(` - CREATE TABLE IF NOT EXISTS staffbanmessages ( - userId VARCHAR(32) PRIMARY KEY, - userTag VARCHAR(100), - message TEXT, + guildId VARCHAR(32), timestamp BIGINT - ) + ) `); - // Table pour les tickets - await conn.query(` - CREATE TABLE IF NOT EXISTS tickets ( - id INT AUTO_INCREMENT PRIMARY KEY, - ticketId VARCHAR(20) UNIQUE NOT NULL, - channelId VARCHAR(32) UNIQUE NOT NULL, - userId VARCHAR(32) NOT NULL, - userTag VARCHAR(100), - guildId VARCHAR(32) NOT NULL, - type ENUM('Support', 'Plainte', 'Plainte Staff', 'Candidature', 'Problème Technique') NOT NULL, - status ENUM('Ouvert', 'Fermé', 'En attente', 'Supprimé') DEFAULT 'Ouvert', - createdAt BIGINT NOT NULL, - closedAt BIGINT, - closedBy VARCHAR(32), - transcript TEXT, - transcriptPath VARCHAR(255), - INDEX idx_userId (userId), - INDEX idx_guildId (guildId), - INDEX idx_status (status) - ) - `); + await conn.query(` + CREATE TABLE IF NOT EXISTS mutes ( + userId VARCHAR(32), + guildId VARCHAR(32), + reason TEXT, + modId VARCHAR(32), + modTag VARCHAR(100), + timestamp BIGINT, + unmuteDate BIGINT, + type VARCHAR(20) NOT NULL, + PRIMARY KEY (userId, guildId) + ) + `); - // Ajouter la colonne transcriptPath si elle n'existe pas (migration) - try { - await conn.query('ALTER TABLE tickets ADD COLUMN transcriptPath VARCHAR(255)'); - } catch { - // La colonne existe déjà, on continue - } + await conn.query(` + CREATE TABLE IF NOT EXISTS staffbanmessages ( + userId VARCHAR(32) PRIMARY KEY, + userTag VARCHAR(100), + message TEXT, + timestamp BIGINT + ) + `); - // Ajouter la colonne claimedBy si elle n'existe pas (migration) - try { - await conn.query('ALTER TABLE tickets ADD COLUMN claimedBy VARCHAR(32)'); - } catch { - // La colonne existe déjà, on continue - } + // Tables de tickets + await conn.query(` + CREATE TABLE IF NOT EXISTS tickets ( + id INT AUTO_INCREMENT PRIMARY KEY, + ticketId VARCHAR(20) UNIQUE NOT NULL, + channelId VARCHAR(32) UNIQUE NOT NULL, + userId VARCHAR(32) NOT NULL, + userTag VARCHAR(100), + guildId VARCHAR(32) NOT NULL, + type ENUM('Support', 'Plainte', 'Plainte Staff', 'Candidature', 'Problème Technique') NOT NULL, + status ENUM('Ouvert', 'Fermé', 'En attente', 'Supprimé') DEFAULT 'Ouvert', + createdAt BIGINT NOT NULL, + closedAt BIGINT, + closedBy VARCHAR(32), + transcript TEXT, + transcriptPath VARCHAR(255), + claimedBy VARCHAR(32), + claimedAt BIGINT, + claimedByTag VARCHAR(100), + INDEX idx_userId (userId), + INDEX idx_guildId (guildId), + INDEX idx_status (status), + INDEX idx_claimedBy (claimedBy) + ) + `); - // Ajouter la colonne claimedAt si elle n'existe pas (migration) - try { - await conn.query('ALTER TABLE tickets ADD COLUMN claimedAt BIGINT'); - } catch { - // La colonne existe déjà, on continue - } + await conn.query(` + CREATE TABLE IF NOT EXISTS ticket_messages ( + id INT AUTO_INCREMENT PRIMARY KEY, + ticketId VARCHAR(20) NOT NULL, + messageId VARCHAR(32) NOT NULL, + userId VARCHAR(32) NOT NULL, + userTag VARCHAR(100), + content TEXT, + attachments TEXT, + timestamp BIGINT NOT NULL, + INDEX idx_ticketId (ticketId), + INDEX idx_messageId (messageId) + ) + `); - // Ajouter la colonne claimedByTag si elle n'existe pas (migration) - try { - await conn.query('ALTER TABLE tickets ADD COLUMN claimedByTag VARCHAR(100)'); - } catch { - // La colonne existe déjà, on continue - } + await conn.query(` + CREATE TABLE IF NOT EXISTS candidature_responses ( + id INT AUTO_INCREMENT PRIMARY KEY, + ticketId VARCHAR(20) NOT NULL, + questionNumber INT NOT NULL, + question TEXT NOT NULL, + response TEXT, + timestamp BIGINT NOT NULL, + INDEX idx_ticketId (ticketId) + ) + `); - // Ajouter l'index pour claimedBy si elle n'existe pas (migration) - try { - await conn.query('CREATE INDEX idx_claimedBy ON tickets(claimedBy)'); - } catch { - // L'index existe déjà, on continue - } + // Tables XP + await conn.query(` + CREATE TABLE IF NOT EXISTS user_xp ( + userId VARCHAR(32) NOT NULL, + guildId VARCHAR(32) NOT NULL, + xp INT DEFAULT 0, + level INT DEFAULT 0, + lastMessageTime BIGINT DEFAULT 0, + totalMessages INT DEFAULT 0, + totalVoiceTime INT DEFAULT 0, + lastVoiceJoin BIGINT DEFAULT 0, + lastBumpTime BIGINT DEFAULT 0, + PRIMARY KEY (userId, guildId), + INDEX idx_guildId (guildId), + INDEX idx_xp (xp), + INDEX idx_level (level) + ) + `); - // Table pour les messages des tickets (pour transcription) - await conn.query(` - CREATE TABLE IF NOT EXISTS ticket_messages ( - id INT AUTO_INCREMENT PRIMARY KEY, - ticketId VARCHAR(20) NOT NULL, - messageId VARCHAR(32) NOT NULL, - userId VARCHAR(32) NOT NULL, - userTag VARCHAR(100), - content TEXT, - attachments TEXT, - timestamp BIGINT NOT NULL, - INDEX idx_ticketId (ticketId), - INDEX idx_messageId (messageId) - ) - `); + await conn.query(` + CREATE TABLE IF NOT EXISTS xp_excluded_channels ( + channelId VARCHAR(32) NOT NULL, + guildId VARCHAR(32) NOT NULL, + reason VARCHAR(255), + addedBy VARCHAR(32), + addedAt BIGINT, + PRIMARY KEY (channelId, guildId), + INDEX idx_guildId (guildId) + ) + `); - // Table pour les réponses aux questions de candidature - await conn.query(` - CREATE TABLE IF NOT EXISTS candidature_responses ( - id INT AUTO_INCREMENT PRIMARY KEY, - ticketId VARCHAR(20) NOT NULL, - questionNumber INT NOT NULL, - question TEXT NOT NULL, - response TEXT, - timestamp BIGINT NOT NULL, - INDEX idx_ticketId (ticketId) - ) - `); + await conn.query(` + CREATE TABLE IF NOT EXISTS xp_logs ( + id INT AUTO_INCREMENT PRIMARY KEY, + userId VARCHAR(32) NOT NULL, + guildId VARCHAR(32) NOT NULL, + xpGained INT NOT NULL, + source VARCHAR(50) NOT NULL, + multiplier DECIMAL(3,2) DEFAULT 1.00, + timestamp BIGINT NOT NULL, + INDEX idx_userId (userId), + INDEX idx_guildId (guildId), + INDEX idx_timestamp (timestamp) + ) + `); - // Table pour les niveaux/XP des utilisateurs - await conn.query(` - CREATE TABLE IF NOT EXISTS user_xp ( - userId VARCHAR(32) NOT NULL, - guildId VARCHAR(32) NOT NULL, - xp INT DEFAULT 0, - level INT DEFAULT 0, - lastMessageTime BIGINT DEFAULT 0, - totalMessages INT DEFAULT 0, - totalVoiceTime INT DEFAULT 0, - lastVoiceJoin BIGINT DEFAULT 0, - lastBumpTime BIGINT DEFAULT 0, - PRIMARY KEY (userId, guildId), - INDEX idx_guildId (guildId), - INDEX idx_xp (xp), - INDEX idx_level (level) - ) - `); + // Tables Bump + await conn.query(` + CREATE TABLE IF NOT EXISTS bumps ( + id INT AUTO_INCREMENT PRIMARY KEY, + userId VARCHAR(32) NOT NULL, + guildId VARCHAR(32) NOT NULL, + bumpTime BIGINT NOT NULL, + reminderSent BOOLEAN DEFAULT FALSE, + INDEX idx_userId (userId), + INDEX idx_guildId (guildId), + INDEX idx_bumpTime (bumpTime) + ) + `); - // Table pour les salons exclus de l'XP - await conn.query(` - CREATE TABLE IF NOT EXISTS xp_excluded_channels ( - channelId VARCHAR(32) NOT NULL, - guildId VARCHAR(32) NOT NULL, - reason VARCHAR(255), - addedBy VARCHAR(32), - addedAt BIGINT, - PRIMARY KEY (channelId, guildId), - INDEX idx_guildId (guildId) - ) - `); + await conn.query(` + CREATE TABLE IF NOT EXISTS bump_channels ( + channelId VARCHAR(32) NOT NULL, + guildId VARCHAR(32) NOT NULL, + bumpBotId VARCHAR(32), + addedBy VARCHAR(32), + addedAt BIGINT, + PRIMARY KEY (channelId, guildId), + INDEX idx_guildId (guildId) + ) + `); - // Table pour les logs de gain d'XP (optionnel, pour debugging) - await conn.query(` - CREATE TABLE IF NOT EXISTS xp_logs ( - id INT AUTO_INCREMENT PRIMARY KEY, - userId VARCHAR(32) NOT NULL, - guildId VARCHAR(32) NOT NULL, - xpGained INT NOT NULL, - source VARCHAR(50) NOT NULL, - multiplier DECIMAL(3,2) DEFAULT 1.00, - timestamp BIGINT NOT NULL, - INDEX idx_userId (userId), - INDEX idx_guildId (guildId), - INDEX idx_timestamp (timestamp) - ) - `); + // Tables Profils + await conn.query(` + CREATE TABLE IF NOT EXISTS user_profiles ( + userId VARCHAR(32) NOT NULL, + guildId VARCHAR(32) NOT NULL, + signature TEXT, + birthday DATE, + color VARCHAR(7), + gender VARCHAR(50), + location VARCHAR(100), + updatedAt BIGINT, + PRIMARY KEY (userId, guildId), + INDEX idx_guildId (guildId) + ) + `); - // Table pour stocker les bumps (pour reminder et XP) - await conn.query(` - CREATE TABLE IF NOT EXISTS bumps ( - id INT AUTO_INCREMENT PRIMARY KEY, - userId VARCHAR(32) NOT NULL, - guildId VARCHAR(32) NOT NULL, - bumpTime BIGINT NOT NULL, - reminderSent BOOLEAN DEFAULT FALSE, - INDEX idx_userId (userId), - INDEX idx_guildId (guildId), - INDEX idx_bumpTime (bumpTime) - ) - `); + // Migrations (pour compatibilité existante) + // On utilise la syntaxe standard sans IF NOT EXISTS pour compatibilité maximale + try { + await conn.query('ALTER TABLE bans ADD COLUMN guildId VARCHAR(32)'); + await conn.query('ALTER TABLE bans DROP PRIMARY KEY'); + await conn.query('ALTER TABLE bans ADD PRIMARY KEY (userId, guildId)'); + } catch {} + + try { await conn.query('ALTER TABLE logs ADD COLUMN guildId VARCHAR(32)'); } catch {} + try { await conn.query('ALTER TABLE logs MODIFY COLUMN action VARCHAR(50)'); } catch {} + try { await conn.query('ALTER TABLE tickets ADD COLUMN transcriptPath VARCHAR(255)'); } catch {} + try { await conn.query('ALTER TABLE tickets ADD COLUMN claimedBy VARCHAR(32)'); } catch {} + try { await conn.query('ALTER TABLE tickets ADD COLUMN claimedAt BIGINT'); } catch {} + try { await conn.query('ALTER TABLE tickets ADD COLUMN claimedByTag VARCHAR(100)'); } catch {} + + // Migrations Profils (Sans IF NOT EXISTS) + try { await conn.query('ALTER TABLE user_profiles ADD COLUMN color VARCHAR(7)'); } catch {} + try { await conn.query('ALTER TABLE user_profiles ADD COLUMN gender VARCHAR(50)'); } catch {} + try { await conn.query('ALTER TABLE user_profiles ADD COLUMN location VARCHAR(100)'); } catch {} - // Table pour stocker les salons de bump (configuration) - await conn.query(` - CREATE TABLE IF NOT EXISTS bump_channels ( - channelId VARCHAR(32) NOT NULL, - guildId VARCHAR(32) NOT NULL, - bumpBotId VARCHAR(32), - addedBy VARCHAR(32), - addedAt BIGINT, - PRIMARY KEY (channelId, guildId), - INDEX idx_guildId (guildId) - ) - `); - - // Table pour les profils utilisateurs (signatures, etc.) - await conn.query(` - CREATE TABLE IF NOT EXISTS user_profiles ( - userId VARCHAR(32) NOT NULL, - guildId VARCHAR(32) NOT NULL, - signature TEXT, - birthday DATE, - updatedAt BIGINT, - PRIMARY KEY (userId, guildId), - INDEX idx_guildId (guildId) - ) - `); - } finally { - conn.release(); - } + } finally { + conn.release(); + } } initDB().catch(console.error); -module.exports = pool; +module.exports = pool; \ No newline at end of file diff --git a/functions/moderation/autoUnban.js b/functions/moderation/autoUnban.js index 580c962..9f6f406 100644 --- a/functions/moderation/autoUnban.js +++ b/functions/moderation/autoUnban.js @@ -1,43 +1,41 @@ const chalk = require('chalk'); module.exports = (client, db) => { - setInterval(async () => { - try { - const now = Date.now(); - const [expiredBans] = await db.query( - 'SELECT * FROM bans WHERE type = ? AND unbanDate <= ?', - ['Temporary', now] - ); + setInterval(async () => { + try { + const now = Date.now(); + const [expiredBans] = await db.query( + 'SELECT * FROM bans WHERE type = ? AND unbanDate <= ?', + ['Temporary', now] + ); - if (!expiredBans.length) return; + if (!expiredBans.length) return; - for (const ban of expiredBans) { - const guild = client.guilds.cache.get(ban.guildId); - if (!guild) { - console.warn(chalk.yellow(`⚠️ Impossible de débannir ${ban.userId}: le bot n'est pas dans la guild ${ban.guildId}`)); - continue; - } + for (const ban of expiredBans) { + const guild = client.guilds.cache.get(ban.guildId); + if (!guild) { + console.warn(chalk.yellow(`⚠️ Impossible de débannir ${ban.userId}: le bot n'est pas dans la guild ${ban.guildId}`)); + continue; + } - try { - await guild.members.unban(ban.userId, 'Bannissement temporaire expiré'); - console.log(chalk.green(`✅ Auto-débanni ${ban.userId} de la guild ${guild.name} (${guild.id})`)); - } catch (err) { - console.error(chalk.red(`❌ Échec du débannissement de ${ban.userId} de la guild ${guild.id}:`), err.message); - } + try { + await guild.members.unban(ban.userId, 'Bannissement temporaire expiré'); + console.log(chalk.green(`✅ Auto-débanni ${ban.userId} de la guild ${guild.name} (${guild.id})`)); + } catch (err) { + console.error(chalk.red(`❌ Échec du débannissement de ${ban.userId} de la guild ${guild.id}:`), err.message); + } - // Supprime uniquement le ban correspondant à cette guild - await db.query('DELETE FROM bans WHERE userId = ? AND guildId = ?', [ban.userId, ban.guildId]); + await db.query('DELETE FROM bans WHERE userId = ? AND guildId = ?', [ban.userId, ban.guildId]); - // Log automatique - await db.query( - `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, timestamp, guildId) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, - [ban.userId, null, client.user.id, client.user.tag, 'Débannissement automatique', 'Bannissement temporaire expiré', 'Temporary', Date.now(), ban.guildId] - ); - } + await db.query( + `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, timestamp, guildId) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [ban.userId, null, client.user.id, client.user.tag, 'Débannissement automatique', 'Bannissement temporaire expiré', 'Temporary', Date.now(), ban.guildId] + ); + } - } catch (err) { - console.error(chalk.red('❌ Erreur lors de l\'auto-débannissement:'), err); - } - }, 60_000); -}; + } catch (err) { + console.error(chalk.red('❌ Erreur lors de l\'auto-débannissement:'), err); + } + }, 60_000); +}; \ No newline at end of file diff --git a/functions/moderation/autoUnmute.js b/functions/moderation/autoUnmute.js index e1d2e63..0a2f6b9 100644 --- a/functions/moderation/autoUnmute.js +++ b/functions/moderation/autoUnmute.js @@ -1,51 +1,47 @@ const chalk = require('chalk'); module.exports = (client, db) => { - setInterval(async () => { - try { - const now = Date.now(); - const [expiredMutes] = await db.query( - 'SELECT * FROM mutes WHERE type = ? AND unmuteDate <= ?', - ['Temporary', now] - ); + setInterval(async () => { + try { + const now = Date.now(); + const [expiredMutes] = await db.query( + 'SELECT * FROM mutes WHERE type = ? AND unmuteDate <= ?', + ['Temporary', now] + ); - if (!expiredMutes.length) return; + if (!expiredMutes.length) return; - for (const mute of expiredMutes) { - const guild = client.guilds.cache.get(mute.guildId); - if (!guild) { - console.warn(chalk.yellow(`⚠️ Impossible de démuter ${mute.userId}: le bot n'est pas dans la guild ${mute.guildId}`)); - continue; - } + for (const mute of expiredMutes) { + const guild = client.guilds.cache.get(mute.guildId); + if (!guild) { + console.warn(chalk.yellow(`⚠️ Impossible de démuter ${mute.userId}: le bot n'est pas dans la guild ${mute.guildId}`)); + continue; + } - const member = await guild.members.fetch(mute.userId).catch(() => null); - if (!member) { - // L'utilisateur n'est plus sur le serveur, on supprime quand même le mute - await db.query('DELETE FROM mutes WHERE userId = ? AND guildId = ?', [mute.userId, mute.guildId]); - continue; - } + const member = await guild.members.fetch(mute.userId).catch(() => null); + if (!member) { + await db.query('DELETE FROM mutes WHERE userId = ? AND guildId = ?', [mute.userId, mute.guildId]); + continue; + } - try { - await member.timeout(null, 'Mute temporaire expiré'); - console.log(chalk.green(`✅ Auto-démuté ${mute.userId} de la guild ${guild.name} (${guild.id})`)); - } catch (err) { - console.error(chalk.red(`❌ Échec du démute de ${mute.userId} de la guild ${guild.id}:`), err.message); - } + try { + await member.timeout(null, 'Mute temporaire expiré'); + console.log(chalk.green(`✅ Auto-démuté ${mute.userId} de la guild ${guild.name} (${guild.id})`)); + } catch (err) { + console.error(chalk.red(`❌ Échec du démute de ${mute.userId} de la guild ${guild.id}:`), err.message); + } - // Supprime le mute de la DB - await db.query('DELETE FROM mutes WHERE userId = ? AND guildId = ?', [mute.userId, mute.guildId]); + await db.query('DELETE FROM mutes WHERE userId = ? AND guildId = ?', [mute.userId, mute.guildId]); - // Log automatique - await db.query( - `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, timestamp, guildId) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, - [mute.userId, null, client.user.id, client.user.tag, 'Unmute automatique', 'Mute temporaire expiré', 'Temporary', Date.now(), mute.guildId] - ); - } - - } catch (err) { - console.error(chalk.red('❌ Erreur lors de l\'auto-unmute:'), err); - } - }, 60_000); -}; + await db.query( + `INSERT INTO logs (userId, userTag, modId, modTag, action, reason, type, timestamp, guildId) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [mute.userId, null, client.user.id, client.user.tag, 'Unmute automatique', 'Mute temporaire expiré', 'Temporary', Date.now(), mute.guildId] + ); + } + } catch (err) { + console.error(chalk.red('❌ Erreur lors de l\'auto-unmute:'), err); + } + }, 60_000); +}; \ No newline at end of file diff --git a/functions/xp/xp.js b/functions/xp/xp.js index b91dc75..9d87565 100644 --- a/functions/xp/xp.js +++ b/functions/xp/xp.js @@ -5,217 +5,173 @@ const db = require('../database/db.js'); // Formule de calcul de l'XP nécessaire pour atteindre un niveau -// XP total nécessaire = 5 * (level^2) + (50 * level) + 100 -// Exemples : -// - Niveau 1 : 5 * 1^2 + 50 * 1 + 100 = 155 XP total -// - Niveau 2 : 5 * 2^2 + 50 * 2 + 100 = 220 XP total -// - Niveau 3 : 5 * 3^2 + 50 * 3 + 100 = 295 XP total function getXPForLevel(level) { - if (level <= 0) return 0; - return Math.floor(5 * Math.pow(level, 2) + 50 * level + 100); + if (level <= 0) return 0; + return Math.floor(5 * Math.pow(level, 2) + 50 * level + 100); } // Calculer le niveau à partir de l'XP total function getLevelFromXP(xp) { - if (xp < 0) return 0; - - let level = 0; - let requiredXP = getXPForLevel(level + 1); - - // Trouver le niveau en vérifiant l'XP nécessaire - while (xp >= requiredXP) { - level++; - requiredXP = getXPForLevel(level + 1); - } - - return level; + if (xp < 0) return 0; + + let level = 0; + let requiredXP = getXPForLevel(level + 1); + + while (xp >= requiredXP) { + level++; + requiredXP = getXPForLevel(level + 1); + } + + return level; } // Calculer l'XP nécessaire pour le prochain niveau function getXPForNextLevel(level) { - return getXPForLevel(level + 1); + return getXPForLevel(level + 1); } // Calculer l'XP progress dans le niveau actuel function getXPProgress(xp, level) { - // XP nécessaire pour atteindre le niveau actuel - const xpForCurrentLevel = getXPForLevel(level); - // XP nécessaire pour atteindre le prochain niveau - const xpForNextLevel = getXPForLevel(level + 1); - - // XP dans le niveau actuel (différence entre l'XP total et l'XP du niveau actuel) - const xpInLevel = Math.max(0, xp - xpForCurrentLevel); - // XP nécessaire pour passer au niveau suivant - const xpNeeded = xpForNextLevel - xpForCurrentLevel; - - // Éviter la division par zéro - if (xpNeeded <= 0) { - return { - current: xpInLevel, - needed: 100, - percentage: 0 - }; - } - - const percentage = Math.max(0, Math.min(100, Math.floor((xpInLevel / xpNeeded) * 100))); - - return { - current: xpInLevel, - needed: xpNeeded, - percentage: percentage - }; + const xpForCurrentLevel = getXPForLevel(level); + const xpForNextLevel = getXPForLevel(level + 1); + + const xpInLevel = Math.max(0, xp - xpForCurrentLevel); + const xpNeeded = xpForNextLevel - xpForCurrentLevel; + + if (xpNeeded <= 0) { + return { current: xpInLevel, needed: 100, percentage: 0 }; + } + + const percentage = Math.max(0, Math.min(100, Math.floor((xpInLevel / xpNeeded) * 100))); + + return { current: xpInLevel, needed: xpNeeded, percentage }; } // Obtenir ou créer un utilisateur dans la table XP async function getUserXP(userId, guildId) { - try { - const [rows] = await db.query( - 'SELECT * FROM user_xp WHERE userId = ? AND guildId = ?', - [userId, guildId] - ); - - if (rows.length === 0) { - // Créer l'utilisateur avec 0 XP - await db.query( - 'INSERT INTO user_xp (userId, guildId, xp, level) VALUES (?, ?, 0, 0)', - [userId, guildId] - ); - return { - userId, - guildId, - xp: 0, - level: 0, - lastMessageTime: 0, - totalMessages: 0, - totalVoiceTime: 0, - lastVoiceJoin: 0, - lastBumpTime: 0 - }; - } - - return rows[0]; - } catch (err) { - console.error('Erreur lors de la récupération de l\'XP:', err); - return null; - } + try { + const [rows] = await db.query( + 'SELECT * FROM user_xp WHERE userId = ? AND guildId = ?', + [userId, guildId] + ); + + if (rows.length === 0) { + await db.query( + 'INSERT INTO user_xp (userId, guildId, xp, level) VALUES (?, ?, 0, 0)', + [userId, guildId] + ); + return { + userId, guildId, xp: 0, level: 0, + lastMessageTime: 0, totalMessages: 0, + totalVoiceTime: 0, lastVoiceJoin: 0, lastBumpTime: 0 + }; + } + + return rows[0]; + } catch (err) { + console.error('Erreur getUserXP:', err); + return null; + } } // Ajouter de l'XP à un utilisateur async function addXP(userId, guildId, xpGained, source = 'message', multiplier = 1.0) { - try { - const userXP = await getUserXP(userId, guildId); - if (!userXP) return null; - - const finalXP = Math.floor(xpGained * multiplier); - const newXP = userXP.xp + finalXP; - const newLevel = getLevelFromXP(newXP); - - // Mettre à jour l'XP et le niveau - await db.query( - 'UPDATE user_xp SET xp = ?, level = ? WHERE userId = ? AND guildId = ?', - [newXP, newLevel, userId, guildId] - ); - - // Logger le gain d'XP (optionnel, pour debugging) - try { - await db.query( - 'INSERT INTO xp_logs (userId, guildId, xpGained, source, multiplier, timestamp) VALUES (?, ?, ?, ?, ?, ?)', - [userId, guildId, finalXP, source, multiplier, Date.now()] - ); - } catch (logErr) { - // Ignorer les erreurs de log - } - - return { - oldXP: userXP.xp, - newXP, - oldLevel: userXP.level, - newLevel, - xpGained: finalXP, - levelUp: newLevel > userXP.level - }; - } catch (err) { - console.error('Erreur lors de l\'ajout d\'XP:', err); - return null; - } + try { + const userXP = await getUserXP(userId, guildId); + if (!userXP) return null; + + const finalXP = Math.floor(xpGained * multiplier); + const newXP = userXP.xp + finalXP; + const newLevel = getLevelFromXP(newXP); + + await db.query( + 'UPDATE user_xp SET xp = ?, level = ? WHERE userId = ? AND guildId = ?', + [newXP, newLevel, userId, guildId] + ); + + try { + await db.query( + 'INSERT INTO xp_logs (userId, guildId, xpGained, source, multiplier, timestamp) VALUES (?, ?, ?, ?, ?, ?)', + [userId, guildId, finalXP, source, multiplier, Date.now()] + ); + } catch {} + + return { + oldXP: userXP.xp, + newXP, + oldLevel: userXP.level, + newLevel, + xpGained: finalXP, + levelUp: newLevel > userXP.level + }; + } catch (err) { + console.error('Erreur addXP:', err); + return null; + } } // Vérifier si un salon est exclus de l'XP async function isChannelExcluded(channelId, guildId) { - try { - const [rows] = await db.query( - 'SELECT * FROM xp_excluded_channels WHERE channelId = ? AND guildId = ?', - [channelId, guildId] - ); - return rows.length > 0; - } catch (err) { - console.error('Erreur lors de la vérification de l\'exclusion:', err); - return false; - } + try { + const [rows] = await db.query( + 'SELECT * FROM xp_excluded_channels WHERE channelId = ? AND guildId = ?', + [channelId, guildId] + ); + return rows.length > 0; + } catch (err) { + console.error('Erreur isChannelExcluded:', err); + return false; + } } -// Obtenir le multiplicateur XP d'un utilisateur (booster, vocal, etc.) +// Obtenir le multiplicateur XP d'un utilisateur function getXPMultiplier(member, source = 'message') { - let multiplier = 1.0; - - // Vérifier si l'utilisateur est booster (1.2x) - if (member.premiumSince) { - multiplier *= 1.2; - } - - // Multiplicateur vocal : 1.0x après 5 minutes de vocal (selon Issue #11) - // Note: Cette fonction est appelée toutes les 10 minutes, donc on applique déjà le bonus - if (source === 'voice') { - // Le bonus vocal est déjà appliqué car on gagne de l'XP toutes les 10 minutes - // Donc on considère qu'on a déjà passé plus de 5 minutes - multiplier *= 1.0; // Pas de changement, mais on pourrait ajouter un bonus ici - } - - return multiplier; + let multiplier = 1.0; + if (member.premiumSince) multiplier *= 1.2; + return multiplier; } // Obtenir le classement des utilisateurs par XP async function getLeaderboard(guildId, limit = 10) { - try { - const [rows] = await db.query( - 'SELECT * FROM user_xp WHERE guildId = ? ORDER BY xp DESC LIMIT ?', - [guildId, limit] - ); - return rows; - } catch (err) { - console.error('Erreur lors de la récupération du classement:', err); - return []; - } + try { + const [rows] = await db.query( + 'SELECT * FROM user_xp WHERE guildId = ? ORDER BY xp DESC LIMIT ?', + [guildId, limit] + ); + return rows; + } catch (err) { + console.error('Erreur getLeaderboard:', err); + return []; + } } // Obtenir la position d'un utilisateur dans le classement async function getUserRank(userId, guildId) { - try { - const userXP = await getUserXP(userId, guildId); - if (!userXP) return 0; - - const [rows] = await db.query( - 'SELECT COUNT(*) as count FROM user_xp WHERE guildId = ? AND xp > ?', - [guildId, userXP.xp] - ); - - return (rows[0]?.count || 0) + 1; - } catch (err) { - console.error('Erreur lors de la récupération du rang:', err); - return 0; - } + try { + const userXP = await getUserXP(userId, guildId); + if (!userXP) return 0; + + const [rows] = await db.query( + 'SELECT COUNT(*) as count FROM user_xp WHERE guildId = ? AND xp > ?', + [guildId, userXP.xp] + ); + + return (rows[0]?.count || 0) + 1; + } catch (err) { + console.error('Erreur getUserRank:', err); + return 0; + } } module.exports = { - getXPForLevel, - getLevelFromXP, - getXPForNextLevel, - getXPProgress, - getUserXP, - addXP, - isChannelExcluded, - getXPMultiplier, - getLeaderboard, - getUserRank, -}; - + getXPForLevel, + getLevelFromXP, + getXPForNextLevel, + getXPProgress, + getUserXP, + addXP, + isChannelExcluded, + getXPMultiplier, + getLeaderboard, + getUserRank, +}; \ No newline at end of file diff --git a/index.js b/index.js index f1c21f2..d208576 100644 --- a/index.js +++ b/index.js @@ -8,19 +8,19 @@ const chalk = require('chalk'); const token = process.env.TOKEN; if (!token) { - console.error(chalk.red('❌ Le token Discord n\'est pas défini dans les variables d\'environnement !')); - process.exit(1); + console.error(chalk.red('❌ Le token Discord n\'est pas défini dans les variables d\'environnement !')); + process.exit(1); } const client = new Client({ - intents: [ - GatewayIntentBits.Guilds, - GatewayIntentBits.GuildMembers, - GatewayIntentBits.GuildPresences, - GatewayIntentBits.GuildMessages, - GatewayIntentBits.MessageContent, - GatewayIntentBits.GuildVoiceStates, - ], + intents: [ + GatewayIntentBits.Guilds, + GatewayIntentBits.GuildMembers, + GatewayIntentBits.GuildPresences, + GatewayIntentBits.GuildMessages, + GatewayIntentBits.MessageContent, + GatewayIntentBits.GuildVoiceStates, + ], }); const db = require('./functions/database/db.js'); @@ -40,11 +40,15 @@ for (const folder of commandFolders) { const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.js')); for (const file of commandFiles) { const filePath = path.join(commandsPath, file); - const command = require(filePath); - if ('data' in command && 'execute' in command) { - client.commands.set(command.data.name, command); - } else { - console.warn(chalk.yellow(`⚠️ La commande à ${filePath} manque une propriété requise "data" ou "execute".`)); + try { + const command = require(filePath); + if ('data' in command && 'execute' in command) { + client.commands.set(command.data.name, command); + } else { + console.warn(chalk.yellow(`⚠️ La commande à ${filePath} manque une propriété requise "data" ou "execute".`)); + } + } catch (error) { + console.error(chalk.red(`❌ Erreur lors du chargement de la commande à ${filePath}:`), error); } } } @@ -54,15 +58,19 @@ const eventFiles = fs.readdirSync(eventsPath).filter(file => file.endsWith('.js' for (const file of eventFiles) { const filePath = path.join(eventsPath, file); - const event = require(filePath); - if (event.once) { - client.once(event.name, (...args) => event.execute(...args)); - } else { - client.on(event.name, (...args) => event.execute(...args)); + try { + const event = require(filePath); + if (event.once) { + client.once(event.name, (...args) => event.execute(...args)); + } else { + client.on(event.name, (...args) => event.execute(...args)); + } + } catch (error) { + console.error(chalk.red(`❌ Erreur lors du chargement de l'événement à ${filePath}:`), error); } } client.login(token).catch(err => { - console.error(chalk.red('❌ Erreur lors de la connexion:'), err); - process.exit(1); + console.error(chalk.red('❌ Erreur lors de la connexion:'), err); + process.exit(1); }); \ No newline at end of file diff --git a/node_modules/@discordjs/builders/README.md b/node_modules/@discordjs/builders/README.md index dc88b7f..626d709 100644 --- a/node_modules/@discordjs/builders/README.md +++ b/node_modules/@discordjs/builders/README.md @@ -9,7 +9,8 @@ npm version npm downloads Build status - Code coverage + Last commit. + Code coverage

Vercel diff --git a/node_modules/@discordjs/builders/dist/index.d.mts b/node_modules/@discordjs/builders/dist/index.d.mts index 428a46b..ed32ea0 100644 --- a/node_modules/@discordjs/builders/dist/index.d.mts +++ b/node_modules/@discordjs/builders/dist/index.d.mts @@ -1,5 +1,5 @@ import * as _sapphire_shapeshift from '@sapphire/shapeshift'; -import { APIEmbedField, APIEmbedAuthor, APIEmbedFooter, APIEmbedImage, APIEmbed, APISelectMenuOption, APIMessageComponentEmoji, ButtonStyle, ChannelType, APIActionRowComponent, APIComponentInActionRow, APIMessageComponent, APIBaseComponent, ComponentType, APIButtonComponent, Snowflake, APISelectMenuComponent, APIChannelSelectComponent, APIMentionableSelectComponent, APISelectMenuDefaultValue, SelectMenuDefaultValueType, APIRoleSelectComponent, APIStringSelectComponent, APIUserSelectComponent, APITextInputComponent, TextInputStyle, APIComponentInMessageActionRow, APIComponentInModalActionRow, APIFileComponent, APISeparatorComponent, SeparatorSpacingSize, APITextDisplayComponent, APIContainerComponent, APIMediaGalleryComponent, APISectionComponent, APIComponentInContainer, APIMediaGalleryItem, APIThumbnailComponent, APIModalComponent, APIModalInteractionResponseCallbackData, LocalizationMap, LocaleString, InteractionContextType, Permissions, ApplicationIntegrationType, RESTPostAPIChatInputApplicationCommandsJSONBody, ApplicationCommandOptionType, APIApplicationCommandBasicOption, APIApplicationCommandAttachmentOption, APIApplicationCommandBooleanOption, APIApplicationCommandChannelOption, APIApplicationCommandOptionChoice, APIApplicationCommandIntegerOption, APIApplicationCommandMentionableOption, APIApplicationCommandNumberOption, APIApplicationCommandRoleOption, APIApplicationCommandStringOption, APIApplicationCommandUserOption, APIApplicationCommandSubcommandGroupOption, APIApplicationCommandSubcommandOption, APIApplicationCommandOption, Locale, ApplicationCommandType, RESTPostAPIContextMenuApplicationCommandsJSONBody } from 'discord-api-types/v10'; +import { APIEmbedField, APIEmbedAuthor, APIEmbedFooter, APIEmbedImage, APIEmbed, APISelectMenuOption, APIMessageComponentEmoji, ButtonStyle, ChannelType, APIBaseComponent, ComponentType, APIActionRowComponent, APIComponentInActionRow, APIMessageComponent, APIModalComponent, APIButtonComponent, Snowflake, APISelectMenuComponent, APIChannelSelectComponent, APIMentionableSelectComponent, APISelectMenuDefaultValue, SelectMenuDefaultValueType, APIRoleSelectComponent, APIStringSelectComponent, APIUserSelectComponent, APITextInputComponent, TextInputStyle, APIComponentInMessageActionRow, APIComponentInModalActionRow, APIFileUploadComponent, APILabelComponent, APIFileComponent, APISeparatorComponent, SeparatorSpacingSize, APITextDisplayComponent, APIContainerComponent, APIMediaGalleryComponent, APISectionComponent, APIComponentInContainer, APIMediaGalleryItem, APIThumbnailComponent, APIModalInteractionResponseCallbackData, LocalizationMap, LocaleString, InteractionContextType, Permissions, ApplicationIntegrationType, RESTPostAPIChatInputApplicationCommandsJSONBody, ApplicationCommandOptionType, APIApplicationCommandBasicOption, APIApplicationCommandAttachmentOption, APIApplicationCommandBooleanOption, APIApplicationCommandChannelOption, APIApplicationCommandOptionChoice, APIApplicationCommandIntegerOption, APIApplicationCommandMentionableOption, APIApplicationCommandNumberOption, APIApplicationCommandRoleOption, APIApplicationCommandStringOption, APIApplicationCommandUserOption, APIApplicationCommandSubcommandOption, APIApplicationCommandSubcommandGroupOption, APIApplicationCommandOption, Locale, ApplicationCommandType, RESTPostAPIContextMenuApplicationCommandsJSONBody } from 'discord-api-types/v10'; export * from '@discordjs/formatters'; import { JSONEncodable, Equatable } from '@discordjs/util'; @@ -52,25 +52,25 @@ declare const embedFooterPredicate: _sapphire_shapeshift.ObjectValidator<{ declare const timestampPredicate: _sapphire_shapeshift.UnionValidator; declare const titlePredicate: _sapphire_shapeshift.UnionValidator; -declare const Assertions$6_RGBPredicate: typeof RGBPredicate; -declare const Assertions$6_authorNamePredicate: typeof authorNamePredicate; -declare const Assertions$6_colorPredicate: typeof colorPredicate; -declare const Assertions$6_embedAuthorPredicate: typeof embedAuthorPredicate; -declare const Assertions$6_embedFieldPredicate: typeof embedFieldPredicate; -declare const Assertions$6_embedFieldsArrayPredicate: typeof embedFieldsArrayPredicate; -declare const Assertions$6_embedFooterPredicate: typeof embedFooterPredicate; -declare const Assertions$6_fieldInlinePredicate: typeof fieldInlinePredicate; -declare const Assertions$6_fieldLengthPredicate: typeof fieldLengthPredicate; -declare const Assertions$6_fieldNamePredicate: typeof fieldNamePredicate; -declare const Assertions$6_fieldValuePredicate: typeof fieldValuePredicate; -declare const Assertions$6_footerTextPredicate: typeof footerTextPredicate; -declare const Assertions$6_imageURLPredicate: typeof imageURLPredicate; -declare const Assertions$6_timestampPredicate: typeof timestampPredicate; -declare const Assertions$6_titlePredicate: typeof titlePredicate; -declare const Assertions$6_urlPredicate: typeof urlPredicate; -declare const Assertions$6_validateFieldLength: typeof validateFieldLength; -declare namespace Assertions$6 { - export { Assertions$6_RGBPredicate as RGBPredicate, Assertions$6_authorNamePredicate as authorNamePredicate, Assertions$6_colorPredicate as colorPredicate, descriptionPredicate$1 as descriptionPredicate, Assertions$6_embedAuthorPredicate as embedAuthorPredicate, Assertions$6_embedFieldPredicate as embedFieldPredicate, Assertions$6_embedFieldsArrayPredicate as embedFieldsArrayPredicate, Assertions$6_embedFooterPredicate as embedFooterPredicate, Assertions$6_fieldInlinePredicate as fieldInlinePredicate, Assertions$6_fieldLengthPredicate as fieldLengthPredicate, Assertions$6_fieldNamePredicate as fieldNamePredicate, Assertions$6_fieldValuePredicate as fieldValuePredicate, Assertions$6_footerTextPredicate as footerTextPredicate, Assertions$6_imageURLPredicate as imageURLPredicate, Assertions$6_timestampPredicate as timestampPredicate, Assertions$6_titlePredicate as titlePredicate, Assertions$6_urlPredicate as urlPredicate, Assertions$6_validateFieldLength as validateFieldLength }; +declare const Assertions$9_RGBPredicate: typeof RGBPredicate; +declare const Assertions$9_authorNamePredicate: typeof authorNamePredicate; +declare const Assertions$9_colorPredicate: typeof colorPredicate; +declare const Assertions$9_embedAuthorPredicate: typeof embedAuthorPredicate; +declare const Assertions$9_embedFieldPredicate: typeof embedFieldPredicate; +declare const Assertions$9_embedFieldsArrayPredicate: typeof embedFieldsArrayPredicate; +declare const Assertions$9_embedFooterPredicate: typeof embedFooterPredicate; +declare const Assertions$9_fieldInlinePredicate: typeof fieldInlinePredicate; +declare const Assertions$9_fieldLengthPredicate: typeof fieldLengthPredicate; +declare const Assertions$9_fieldNamePredicate: typeof fieldNamePredicate; +declare const Assertions$9_fieldValuePredicate: typeof fieldValuePredicate; +declare const Assertions$9_footerTextPredicate: typeof footerTextPredicate; +declare const Assertions$9_imageURLPredicate: typeof imageURLPredicate; +declare const Assertions$9_timestampPredicate: typeof timestampPredicate; +declare const Assertions$9_titlePredicate: typeof titlePredicate; +declare const Assertions$9_urlPredicate: typeof urlPredicate; +declare const Assertions$9_validateFieldLength: typeof validateFieldLength; +declare namespace Assertions$9 { + export { Assertions$9_RGBPredicate as RGBPredicate, Assertions$9_authorNamePredicate as authorNamePredicate, Assertions$9_colorPredicate as colorPredicate, descriptionPredicate$1 as descriptionPredicate, Assertions$9_embedAuthorPredicate as embedAuthorPredicate, Assertions$9_embedFieldPredicate as embedFieldPredicate, Assertions$9_embedFieldsArrayPredicate as embedFieldsArrayPredicate, Assertions$9_embedFooterPredicate as embedFooterPredicate, Assertions$9_fieldInlinePredicate as fieldInlinePredicate, Assertions$9_fieldLengthPredicate as fieldLengthPredicate, Assertions$9_fieldNamePredicate as fieldNamePredicate, Assertions$9_fieldValuePredicate as fieldValuePredicate, Assertions$9_footerTextPredicate as footerTextPredicate, Assertions$9_imageURLPredicate as imageURLPredicate, Assertions$9_timestampPredicate as timestampPredicate, Assertions$9_titlePredicate as titlePredicate, Assertions$9_urlPredicate as urlPredicate, Assertions$9_validateFieldLength as validateFieldLength }; } /** @@ -181,7 +181,7 @@ declare class EmbedBuilder { * * @remarks * This method behaves similarly - * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}. + * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}. * The maximum amount of fields that can be added is 25. * * It's useful for modifying and adjusting order of the already-existing fields of an embed. @@ -362,6 +362,9 @@ declare const buttonStyleValidator: _sapphire_shapeshift.NativeEnumValidator; declare const minMaxValidator: _sapphire_shapeshift.NumberValidator; declare const labelValueDescriptionValidator: _sapphire_shapeshift.StringValidator; +/** + * @deprecated Replaced with selectMenuStringOptionPredicate. + */ declare const jsonOptionValidator: _sapphire_shapeshift.ObjectValidator<{ label: string; value: string; @@ -393,32 +396,32 @@ declare const channelTypesValidator: _sapphire_shapeshift.ArrayValidator; declare function validateRequiredButtonParameters(style?: ButtonStyle, label?: string, emoji?: APIMessageComponentEmoji, customId?: string, skuId?: string, url?: string): void; -declare const Assertions$5_buttonLabelValidator: typeof buttonLabelValidator; -declare const Assertions$5_buttonStyleValidator: typeof buttonStyleValidator; -declare const Assertions$5_channelTypesValidator: typeof channelTypesValidator; -declare const Assertions$5_customIdValidator: typeof customIdValidator; -declare const Assertions$5_defaultValidator: typeof defaultValidator; -declare const Assertions$5_disabledValidator: typeof disabledValidator; -declare const Assertions$5_emojiValidator: typeof emojiValidator; -declare const Assertions$5_idValidator: typeof idValidator; -declare const Assertions$5_jsonOptionValidator: typeof jsonOptionValidator; -declare const Assertions$5_labelValueDescriptionValidator: typeof labelValueDescriptionValidator; -declare const Assertions$5_minMaxValidator: typeof minMaxValidator; -declare const Assertions$5_optionValidator: typeof optionValidator; -declare const Assertions$5_optionsLengthValidator: typeof optionsLengthValidator; -declare const Assertions$5_optionsValidator: typeof optionsValidator; -declare const Assertions$5_urlValidator: typeof urlValidator; -declare const Assertions$5_validateRequiredButtonParameters: typeof validateRequiredButtonParameters; -declare const Assertions$5_validateRequiredSelectMenuOptionParameters: typeof validateRequiredSelectMenuOptionParameters; -declare const Assertions$5_validateRequiredSelectMenuParameters: typeof validateRequiredSelectMenuParameters; -declare namespace Assertions$5 { - export { Assertions$5_buttonLabelValidator as buttonLabelValidator, Assertions$5_buttonStyleValidator as buttonStyleValidator, Assertions$5_channelTypesValidator as channelTypesValidator, Assertions$5_customIdValidator as customIdValidator, Assertions$5_defaultValidator as defaultValidator, Assertions$5_disabledValidator as disabledValidator, Assertions$5_emojiValidator as emojiValidator, Assertions$5_idValidator as idValidator, Assertions$5_jsonOptionValidator as jsonOptionValidator, Assertions$5_labelValueDescriptionValidator as labelValueDescriptionValidator, Assertions$5_minMaxValidator as minMaxValidator, Assertions$5_optionValidator as optionValidator, Assertions$5_optionsLengthValidator as optionsLengthValidator, Assertions$5_optionsValidator as optionsValidator, placeholderValidator$1 as placeholderValidator, Assertions$5_urlValidator as urlValidator, Assertions$5_validateRequiredButtonParameters as validateRequiredButtonParameters, Assertions$5_validateRequiredSelectMenuOptionParameters as validateRequiredSelectMenuOptionParameters, Assertions$5_validateRequiredSelectMenuParameters as validateRequiredSelectMenuParameters }; +declare const Assertions$8_buttonLabelValidator: typeof buttonLabelValidator; +declare const Assertions$8_buttonStyleValidator: typeof buttonStyleValidator; +declare const Assertions$8_channelTypesValidator: typeof channelTypesValidator; +declare const Assertions$8_customIdValidator: typeof customIdValidator; +declare const Assertions$8_defaultValidator: typeof defaultValidator; +declare const Assertions$8_disabledValidator: typeof disabledValidator; +declare const Assertions$8_emojiValidator: typeof emojiValidator; +declare const Assertions$8_idValidator: typeof idValidator; +declare const Assertions$8_jsonOptionValidator: typeof jsonOptionValidator; +declare const Assertions$8_labelValueDescriptionValidator: typeof labelValueDescriptionValidator; +declare const Assertions$8_minMaxValidator: typeof minMaxValidator; +declare const Assertions$8_optionValidator: typeof optionValidator; +declare const Assertions$8_optionsLengthValidator: typeof optionsLengthValidator; +declare const Assertions$8_optionsValidator: typeof optionsValidator; +declare const Assertions$8_urlValidator: typeof urlValidator; +declare const Assertions$8_validateRequiredButtonParameters: typeof validateRequiredButtonParameters; +declare const Assertions$8_validateRequiredSelectMenuOptionParameters: typeof validateRequiredSelectMenuOptionParameters; +declare const Assertions$8_validateRequiredSelectMenuParameters: typeof validateRequiredSelectMenuParameters; +declare namespace Assertions$8 { + export { Assertions$8_buttonLabelValidator as buttonLabelValidator, Assertions$8_buttonStyleValidator as buttonStyleValidator, Assertions$8_channelTypesValidator as channelTypesValidator, Assertions$8_customIdValidator as customIdValidator, Assertions$8_defaultValidator as defaultValidator, Assertions$8_disabledValidator as disabledValidator, Assertions$8_emojiValidator as emojiValidator, Assertions$8_idValidator as idValidator, Assertions$8_jsonOptionValidator as jsonOptionValidator, Assertions$8_labelValueDescriptionValidator as labelValueDescriptionValidator, Assertions$8_minMaxValidator as minMaxValidator, Assertions$8_optionValidator as optionValidator, Assertions$8_optionsLengthValidator as optionsLengthValidator, Assertions$8_optionsValidator as optionsValidator, placeholderValidator$1 as placeholderValidator, Assertions$8_urlValidator as urlValidator, Assertions$8_validateRequiredButtonParameters as validateRequiredButtonParameters, Assertions$8_validateRequiredSelectMenuOptionParameters as validateRequiredSelectMenuOptionParameters, Assertions$8_validateRequiredSelectMenuParameters as validateRequiredSelectMenuParameters }; } /** * Any action row component data represented as an object. */ -type AnyAPIActionRowComponent = APIActionRowComponent | APIComponentInActionRow | APIMessageComponent; +type AnyAPIActionRowComponent = APIActionRowComponent | APIComponentInActionRow | APIMessageComponent | APIModalComponent; /** * The base component builder that contains common symbols for all sorts of components. * @@ -561,9 +564,9 @@ declare abstract class BaseSelectMenuBuilder i * ```ts * const textInput = new TextInputBuilder({ * custom_id: 'a cool text input', - * label: 'Type something', + * placeholder: 'Type something', * style: TextInputStyle.Short, * }); * ``` @@ -884,7 +894,7 @@ declare class TextInputBuilder extends ComponentBuilder i * Creating a text input using setters and API data: * ```ts * const textInput = new TextInputBuilder({ - * label: 'Type something else', + * placeholder: 'Type something else', * }) * .setCustomId('woah') * .setStyle(TextInputStyle.Paragraph); @@ -903,6 +913,7 @@ declare class TextInputBuilder extends ComponentBuilder i * Sets the label for this text input. * * @param label - The label to use + * @deprecated Use a label builder to create a label (and optionally a description) instead. */ setLabel(label: string): this; /** @@ -1030,6 +1041,169 @@ declare class ActionRowBuilder extend toJSON(): APIActionRowComponent>; } +/** + * A builder that creates API-compatible JSON data for file uploads. + */ +declare class FileUploadBuilder extends ComponentBuilder { + /** + * Creates a new file upload. + * + * @param data - The API data to create this file upload with + * @example + * Creating a file upload from an API data object: + * ```ts + * const fileUpload = new FileUploadBuilder({ + * custom_id: "file_upload", + * min_values: 2, + * max_values: 5, + * }); + * ``` + * @example + * Creating a file upload using setters and API data: + * ```ts + * const fileUpload = new FileUploadBuilder({ + * custom_id: "file_upload", + * min_values: 2, + * max_values: 5, + * }).setRequired(); + * ``` + */ + constructor(data?: Partial); + /** + * Sets the custom id for this file upload. + * + * @param customId - The custom id to use + */ + setCustomId(customId: string): this; + /** + * Sets the minimum number of file uploads required. + * + * @param minValues - The minimum values that must be uploaded + */ + setMinValues(minValues: number): this; + /** + * Clears the minimum values. + */ + clearMinValues(): this; + /** + * Sets the maximum number of file uploads required. + * + * @param maxValues - The maximum values that can be uploaded + */ + setMaxValues(maxValues: number): this; + /** + * Clears the maximum values. + */ + clearMaxValues(): this; + /** + * Sets whether this file upload is required. + * + * @param required - Whether this file upload is required + */ + setRequired(required?: boolean): this; + /** + * {@inheritDoc ComponentBuilder.toJSON} + */ + toJSON(): APIFileUploadComponent; +} + +interface LabelBuilderData extends Partial> { + component?: ChannelSelectMenuBuilder | FileUploadBuilder | MentionableSelectMenuBuilder | RoleSelectMenuBuilder | StringSelectMenuBuilder | TextInputBuilder | UserSelectMenuBuilder; +} +/** + * A builder that creates API-compatible JSON data for labels. + */ +declare class LabelBuilder extends ComponentBuilder { + /** + * @internal + */ + readonly data: LabelBuilderData; + /** + * Creates a new label. + * + * @param data - The API data to create this label with + * @example + * Creating a label from an API data object: + * ```ts + * const label = new LabelBuilder({ + * label: "label", + * component, + * }); + * ``` + * @example + * Creating a label using setters and API data: + * ```ts + * const label = new LabelBuilder({ + * label: 'label', + * component, + * }).setLabel('new text'); + * ``` + */ + constructor(data?: Partial); + /** + * Sets the label for this label. + * + * @param label - The label to use + */ + setLabel(label: string): this; + /** + * Sets the description for this label. + * + * @param description - The description to use + */ + setDescription(description: string): this; + /** + * Clears the description for this label. + */ + clearDescription(): this; + /** + * Sets a string select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setStringSelectMenuComponent(input: APIStringSelectComponent | StringSelectMenuBuilder | ((builder: StringSelectMenuBuilder) => StringSelectMenuBuilder)): this; + /** + * Sets a user select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setUserSelectMenuComponent(input: APIUserSelectComponent | UserSelectMenuBuilder | ((builder: UserSelectMenuBuilder) => UserSelectMenuBuilder)): this; + /** + * Sets a role select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setRoleSelectMenuComponent(input: APIRoleSelectComponent | RoleSelectMenuBuilder | ((builder: RoleSelectMenuBuilder) => RoleSelectMenuBuilder)): this; + /** + * Sets a mentionable select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setMentionableSelectMenuComponent(input: APIMentionableSelectComponent | MentionableSelectMenuBuilder | ((builder: MentionableSelectMenuBuilder) => MentionableSelectMenuBuilder)): this; + /** + * Sets a channel select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setChannelSelectMenuComponent(input: APIChannelSelectComponent | ChannelSelectMenuBuilder | ((builder: ChannelSelectMenuBuilder) => ChannelSelectMenuBuilder)): this; + /** + * Sets a text input component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setTextInputComponent(input: APITextInputComponent | TextInputBuilder | ((builder: TextInputBuilder) => TextInputBuilder)): this; + /** + * Sets a file upload component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setFileUploadComponent(input: APIFileUploadComponent | FileUploadBuilder | ((builder: FileUploadBuilder) => FileUploadBuilder)): this; + /** + * {@inheritDoc ComponentBuilder.toJSON} + */ + toJSON(): APILabelComponent; +} + declare class FileBuilder extends ComponentBuilder { /** * Creates a new file from API data. @@ -1193,7 +1367,8 @@ declare class ContainerBuilder extends ComponentBuilder { * }, * ], * }) - * .addComponents(separator, section); + * .addSeparatorComponents(separator) + * .addSectionComponents(section); * ``` */ constructor({ components, ...data }?: Partial); @@ -1592,6 +1767,14 @@ interface MappedComponentTypes { * The media gallery component type is associated with a {@link MediaGalleryBuilder}. */ [ComponentType.MediaGallery]: MediaGalleryBuilder; + /** + * The label component type is associated with a {@link LabelBuilder}. + */ + [ComponentType.Label]: LabelBuilder; + /** + * The file upload component type is associated with a {@link FileUploadBuilder}. + */ + [ComponentType.FileUpload]: FileUploadBuilder; } /** * Factory for creating components from API data. @@ -1618,17 +1801,39 @@ 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 textInputPredicate: _sapphire_shapeshift.ObjectValidator<{ + type: ComponentType; + custom_id: string; + style: TextInputStyle; + id: number | undefined; + min_length: number | undefined; + max_length: number | undefined; + placeholder: string | undefined; + value: string | undefined; + required: boolean | undefined; +}, _sapphire_shapeshift.UndefinedToOptional<{ + type: ComponentType; + custom_id: string; + style: TextInputStyle; + id: number | undefined; + min_length: number | undefined; + max_length: number | undefined; + placeholder: string | undefined; + value: string | undefined; + required: boolean | undefined; +}>>; +declare function validateRequiredParameters$3(customId?: string, style?: TextInputStyle): void; -declare const Assertions$4_labelValidator: typeof labelValidator; -declare const Assertions$4_maxLengthValidator: typeof maxLengthValidator; -declare const Assertions$4_minLengthValidator: typeof minLengthValidator; -declare const Assertions$4_placeholderValidator: typeof placeholderValidator; -declare const Assertions$4_requiredValidator: typeof requiredValidator; -declare const Assertions$4_textInputStyleValidator: typeof textInputStyleValidator; -declare const Assertions$4_valueValidator: typeof valueValidator; -declare namespace Assertions$4 { - export { Assertions$4_labelValidator as labelValidator, Assertions$4_maxLengthValidator as maxLengthValidator, Assertions$4_minLengthValidator as minLengthValidator, Assertions$4_placeholderValidator as placeholderValidator, Assertions$4_requiredValidator as requiredValidator, Assertions$4_textInputStyleValidator as textInputStyleValidator, validateRequiredParameters$3 as validateRequiredParameters, Assertions$4_valueValidator as valueValidator }; +declare const Assertions$7_labelValidator: typeof labelValidator; +declare const Assertions$7_maxLengthValidator: typeof maxLengthValidator; +declare const Assertions$7_minLengthValidator: typeof minLengthValidator; +declare const Assertions$7_placeholderValidator: typeof placeholderValidator; +declare const Assertions$7_requiredValidator: typeof requiredValidator; +declare const Assertions$7_textInputPredicate: typeof textInputPredicate; +declare const Assertions$7_textInputStyleValidator: typeof textInputStyleValidator; +declare const Assertions$7_valueValidator: typeof valueValidator; +declare namespace Assertions$7 { + export { Assertions$7_labelValidator as labelValidator, Assertions$7_maxLengthValidator as maxLengthValidator, Assertions$7_minLengthValidator as minLengthValidator, Assertions$7_placeholderValidator as placeholderValidator, Assertions$7_requiredValidator as requiredValidator, Assertions$7_textInputPredicate as textInputPredicate, Assertions$7_textInputStyleValidator as textInputStyleValidator, validateRequiredParameters$3 as validateRequiredParameters, Assertions$7_valueValidator as valueValidator }; } /** @@ -1642,7 +1847,7 @@ declare class ModalBuilder implements JSONEncodable[]; + readonly components: (ActionRowBuilder | LabelBuilder | TextDisplayBuilder)[]; /** * Creates a new modal from API data. * @@ -1665,14 +1870,71 @@ declare class ModalBuilder implements JSONEncodable | APIActionRowComponent>): this; + addComponents(...components: RestOrArray | APIActionRowComponent | APILabelComponent | APITextDisplayComponent | APITextInputComponent | LabelBuilder | TextDisplayBuilder | TextInputBuilder>): this; + /** + * Adds label components to this modal. + * + * @param components - The components to add + */ + addLabelComponents(...components: RestOrArray LabelBuilder)>): this; + /** + * Adds text display components to this modal. + * + * @param components - The components to add + */ + addTextDisplayComponents(...components: RestOrArray TextDisplayBuilder)>): this; + /** + * Adds action rows to this modal. + * + * @param components - The components to add + * @deprecated Use {@link ModalBuilder.addLabelComponents} instead + */ + addActionRowComponents(...components: RestOrArray | APIActionRowComponent | ((builder: ActionRowBuilder) => ActionRowBuilder)>): this; + /** + * Sets the labels for this modal. + * + * @param components - The components to set + */ + setLabelComponents(...components: RestOrArray LabelBuilder)>): this; + /** + * Removes, replaces, or inserts labels for this modal. + * + * @remarks + * This method behaves similarly + * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}. + * The maximum amount of labels that can be added is 5. + * + * It's useful for modifying and adjusting order of the already-existing labels of a modal. + * @example + * Remove the first label: + * ```ts + * modal.spliceLabelComponents(0, 1); + * ``` + * @example + * Remove the first n labels: + * ```ts + * const n = 4; + * modal.spliceLabelComponents(0, n); + * ``` + * @example + * Remove the last label: + * ```ts + * modal.spliceLabelComponents(-1, 1); + * ``` + * @param index - The index to start at + * @param deleteCount - The number of labels to remove + * @param labels - The replacing label objects + */ + spliceLabelComponents(index: number, deleteCount: number, ...labels: (APILabelComponent | LabelBuilder | ((builder: LabelBuilder) => LabelBuilder))[]): this; /** * Sets components for this modal. * * @param components - The components to set + * @deprecated Use {@link ModalBuilder.setLabelComponents} instead */ - setComponents(...components: RestOrArray>): this; + setComponents(...components: RestOrArray | LabelBuilder | TextDisplayBuilder>): this; /** * {@inheritDoc ComponentBuilder.toJSON} */ @@ -1680,13 +1942,11966 @@ declare class ModalBuilder implements JSONEncodable; -declare const componentsValidator: _sapphire_shapeshift.ArrayValidator<[ActionRowBuilder, ...ActionRowBuilder[]], ActionRowBuilder>; -declare function validateRequiredParameters$2(customId?: string, title?: string, components?: ActionRowBuilder[]): void; +declare const componentsValidator: _sapphire_shapeshift.ArrayValidator<[LabelBuilder | ActionRowBuilder | TextDisplayBuilder, ...(LabelBuilder | ActionRowBuilder | TextDisplayBuilder)[]], LabelBuilder | ActionRowBuilder | TextDisplayBuilder>; +declare function validateRequiredParameters$2(customId?: string, title?: string, components?: (ActionRowBuilder | LabelBuilder | TextDisplayBuilder)[]): void; -declare const Assertions$3_componentsValidator: typeof componentsValidator; -declare const Assertions$3_titleValidator: typeof titleValidator; +declare const Assertions$6_componentsValidator: typeof componentsValidator; +declare const Assertions$6_titleValidator: typeof titleValidator; +declare namespace Assertions$6 { + export { Assertions$6_componentsValidator as componentsValidator, Assertions$6_titleValidator as titleValidator, validateRequiredParameters$2 as validateRequiredParameters }; +} + +declare const selectMenuChannelPredicate: _sapphire_shapeshift.ObjectValidator<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + channel_types: ChannelType[] | undefined; + default_values: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | undefined; +}, _sapphire_shapeshift.UndefinedToOptional<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + channel_types: ChannelType[] | undefined; + default_values: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | undefined; +}>>; +declare const selectMenuMentionablePredicate: _sapphire_shapeshift.ObjectValidator<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + default_values: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | undefined; +}, _sapphire_shapeshift.UndefinedToOptional<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + default_values: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | undefined; +}>>; +declare const selectMenuRolePredicate: _sapphire_shapeshift.ObjectValidator<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + default_values: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | undefined; +}, _sapphire_shapeshift.UndefinedToOptional<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + default_values: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | undefined; +}>>; +declare const selectMenuUserPredicate: _sapphire_shapeshift.ObjectValidator<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + default_values: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | undefined; +}, _sapphire_shapeshift.UndefinedToOptional<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + default_values: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | undefined; +}>>; +declare const selectMenuStringOptionPredicate: _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 selectMenuStringPredicate: _sapphire_shapeshift.ObjectValidator<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + options: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>]; +}, _sapphire_shapeshift.UndefinedToOptional<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + options: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>]; +}>>; + +declare const Assertions$5_selectMenuChannelPredicate: typeof selectMenuChannelPredicate; +declare const Assertions$5_selectMenuMentionablePredicate: typeof selectMenuMentionablePredicate; +declare const Assertions$5_selectMenuRolePredicate: typeof selectMenuRolePredicate; +declare const Assertions$5_selectMenuStringOptionPredicate: typeof selectMenuStringOptionPredicate; +declare const Assertions$5_selectMenuStringPredicate: typeof selectMenuStringPredicate; +declare const Assertions$5_selectMenuUserPredicate: typeof selectMenuUserPredicate; +declare namespace Assertions$5 { + export { Assertions$5_selectMenuChannelPredicate as selectMenuChannelPredicate, Assertions$5_selectMenuMentionablePredicate as selectMenuMentionablePredicate, Assertions$5_selectMenuRolePredicate as selectMenuRolePredicate, Assertions$5_selectMenuStringOptionPredicate as selectMenuStringOptionPredicate, Assertions$5_selectMenuStringPredicate as selectMenuStringPredicate, Assertions$5_selectMenuUserPredicate as selectMenuUserPredicate }; +} + +declare const fileUploadPredicate: _sapphire_shapeshift.ObjectValidator<{ + type: ComponentType; + id: number | undefined; + custom_id: string; + min_values: number | undefined; + max_values: number | undefined; + required: boolean | undefined; +}, _sapphire_shapeshift.UndefinedToOptional<{ + type: ComponentType; + id: number | undefined; + custom_id: string; + min_values: number | undefined; + max_values: number | undefined; + required: boolean | undefined; +}>>; + +declare const Assertions$4_fileUploadPredicate: typeof fileUploadPredicate; +declare namespace Assertions$4 { + export { Assertions$4_fileUploadPredicate as fileUploadPredicate }; +} + +declare const labelPredicate: _sapphire_shapeshift.ObjectValidator<{ + id: number | undefined; + type: ComponentType; + label: string; + description: string | undefined; + component: _sapphire_shapeshift.UndefinedToOptional<{ + type: any; + id: any; + custom_id: any; + min_values: any; + max_values: any; + required: any; + }> | _sapphire_shapeshift.UndefinedToOptional<{ + type: any; + custom_id: any; + style: any; + id: any; + min_length: any; + max_length: any; + placeholder: any; + value: any; + required: any; + }> | _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + placeholder: any; + min_values: any; + max_values: any; + custom_id: any; + disabled: any; + } & { + type: any; + default_values: any; + }> | _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + placeholder: any; + min_values: any; + max_values: any; + custom_id: any; + disabled: any; + } & { + type: any; + options: any; + }>; +}, _sapphire_shapeshift.UndefinedToOptional<{ + id: number | undefined; + type: ComponentType; + label: string; + description: string | undefined; + component: _sapphire_shapeshift.UndefinedToOptional<{ + type: any; + id: any; + custom_id: any; + min_values: any; + max_values: any; + required: any; + }> | _sapphire_shapeshift.UndefinedToOptional<{ + type: any; + custom_id: any; + style: any; + id: any; + min_length: any; + max_length: any; + placeholder: any; + value: any; + required: any; + }> | _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + placeholder: any; + min_values: any; + max_values: any; + custom_id: any; + disabled: any; + } & { + type: any; + default_values: any; + }> | _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + placeholder: any; + min_values: any; + max_values: any; + custom_id: any; + disabled: any; + } & { + type: any; + options: any; + }>; +}>>; + +declare const Assertions$3_labelPredicate: typeof labelPredicate; declare namespace Assertions$3 { - export { Assertions$3_componentsValidator as componentsValidator, Assertions$3_titleValidator as titleValidator, validateRequiredParameters$2 as validateRequiredParameters }; + export { Assertions$3_labelPredicate as labelPredicate }; } declare const unfurledMediaItemPredicate: _sapphire_shapeshift.ObjectValidator<{ @@ -2608,4 +14823,4 @@ declare function isValidationEnabled(): boolean; */ declare const version: string; -export { ActionRowBuilder, type AnyAPIActionRowComponent, type AnyComponentBuilder, ApplicationCommandNumericOptionMinMaxValueMixin, type ApplicationCommandOptionAllowedChannelTypes, ApplicationCommandOptionBase, ApplicationCommandOptionChannelTypesMixin, ApplicationCommandOptionWithAutocompleteMixin, ApplicationCommandOptionWithChoicesMixin, BaseSelectMenuBuilder, ButtonBuilder, ChannelSelectMenuBuilder, Assertions$5 as ComponentAssertions, ComponentBuilder, Assertions$2 as ComponentsV2Assertions, ContainerBuilder, type ContainerComponentBuilder, Assertions as ContextMenuCommandAssertions, ContextMenuCommandBuilder, type ContextMenuCommandType, Assertions$6 as EmbedAssertions, type EmbedAuthorData, type EmbedAuthorOptions, EmbedBuilder, type EmbedFooterData, type EmbedFooterOptions, type EmbedImageData, FileBuilder, type IconData, type MappedComponentTypes, MediaGalleryBuilder, MediaGalleryItemBuilder, MentionableSelectMenuBuilder, type MessageActionRowComponentBuilder, type MessageComponentBuilder, type ModalActionRowComponentBuilder, Assertions$3 as ModalAssertions, ModalBuilder, type ModalComponentBuilder, type RGBTuple, type RestOrArray, RoleSelectMenuBuilder, SectionBuilder, StringSelectMenuBuilder as SelectMenuBuilder, StringSelectMenuOptionBuilder as SelectMenuOptionBuilder, SeparatorBuilder, SharedNameAndDescription, SharedSlashCommand, SharedSlashCommandOptions, SharedSlashCommandSubcommands, Assertions$1 as SlashCommandAssertions, SlashCommandAttachmentOption, SlashCommandBooleanOption, SlashCommandBuilder, SlashCommandChannelOption, SlashCommandIntegerOption, SlashCommandMentionableOption, SlashCommandNumberOption, type SlashCommandOptionsOnlyBuilder, SlashCommandRoleOption, SlashCommandStringOption, SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder, type SlashCommandSubcommandsOnlyBuilder, SlashCommandUserOption, StringSelectMenuBuilder, StringSelectMenuOptionBuilder, TextDisplayBuilder, Assertions$4 as TextInputAssertions, TextInputBuilder, ThumbnailBuilder, type ToAPIApplicationCommandOptions, UserSelectMenuBuilder, createComponentBuilder, disableValidators, embedLength, enableValidators, isValidationEnabled, normalizeArray, resolveBuilder, version }; +export { ActionRowBuilder, type AnyAPIActionRowComponent, type AnyComponentBuilder, ApplicationCommandNumericOptionMinMaxValueMixin, type ApplicationCommandOptionAllowedChannelTypes, ApplicationCommandOptionBase, ApplicationCommandOptionChannelTypesMixin, ApplicationCommandOptionWithAutocompleteMixin, ApplicationCommandOptionWithChoicesMixin, BaseSelectMenuBuilder, ButtonBuilder, ChannelSelectMenuBuilder, Assertions$8 as ComponentAssertions, ComponentBuilder, Assertions$2 as ComponentsV2Assertions, ContainerBuilder, type ContainerComponentBuilder, Assertions as ContextMenuCommandAssertions, ContextMenuCommandBuilder, type ContextMenuCommandType, Assertions$9 as EmbedAssertions, type EmbedAuthorData, type EmbedAuthorOptions, EmbedBuilder, type EmbedFooterData, type EmbedFooterOptions, type EmbedImageData, FileBuilder, Assertions$4 as FileUploadAssertions, FileUploadBuilder, type IconData, Assertions$3 as LabelAssertions, LabelBuilder, type LabelBuilderData, type MappedComponentTypes, MediaGalleryBuilder, MediaGalleryItemBuilder, MentionableSelectMenuBuilder, type MessageActionRowComponentBuilder, type MessageComponentBuilder, type ModalActionRowComponentBuilder, Assertions$6 as ModalAssertions, ModalBuilder, type ModalComponentBuilder, type RGBTuple, type RestOrArray, RoleSelectMenuBuilder, SectionBuilder, Assertions$5 as SelectMenuAssertions, StringSelectMenuBuilder as SelectMenuBuilder, StringSelectMenuOptionBuilder as SelectMenuOptionBuilder, SeparatorBuilder, SharedNameAndDescription, SharedSlashCommand, SharedSlashCommandOptions, SharedSlashCommandSubcommands, Assertions$1 as SlashCommandAssertions, SlashCommandAttachmentOption, SlashCommandBooleanOption, SlashCommandBuilder, SlashCommandChannelOption, SlashCommandIntegerOption, SlashCommandMentionableOption, SlashCommandNumberOption, type SlashCommandOptionsOnlyBuilder, SlashCommandRoleOption, SlashCommandStringOption, SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder, type SlashCommandSubcommandsOnlyBuilder, SlashCommandUserOption, StringSelectMenuBuilder, StringSelectMenuOptionBuilder, TextDisplayBuilder, Assertions$7 as TextInputAssertions, TextInputBuilder, ThumbnailBuilder, type ToAPIApplicationCommandOptions, UserSelectMenuBuilder, createComponentBuilder, disableValidators, embedLength, enableValidators, isValidationEnabled, normalizeArray, resolveBuilder, version }; diff --git a/node_modules/@discordjs/builders/dist/index.d.ts b/node_modules/@discordjs/builders/dist/index.d.ts index 428a46b..ed32ea0 100644 --- a/node_modules/@discordjs/builders/dist/index.d.ts +++ b/node_modules/@discordjs/builders/dist/index.d.ts @@ -1,5 +1,5 @@ import * as _sapphire_shapeshift from '@sapphire/shapeshift'; -import { APIEmbedField, APIEmbedAuthor, APIEmbedFooter, APIEmbedImage, APIEmbed, APISelectMenuOption, APIMessageComponentEmoji, ButtonStyle, ChannelType, APIActionRowComponent, APIComponentInActionRow, APIMessageComponent, APIBaseComponent, ComponentType, APIButtonComponent, Snowflake, APISelectMenuComponent, APIChannelSelectComponent, APIMentionableSelectComponent, APISelectMenuDefaultValue, SelectMenuDefaultValueType, APIRoleSelectComponent, APIStringSelectComponent, APIUserSelectComponent, APITextInputComponent, TextInputStyle, APIComponentInMessageActionRow, APIComponentInModalActionRow, APIFileComponent, APISeparatorComponent, SeparatorSpacingSize, APITextDisplayComponent, APIContainerComponent, APIMediaGalleryComponent, APISectionComponent, APIComponentInContainer, APIMediaGalleryItem, APIThumbnailComponent, APIModalComponent, APIModalInteractionResponseCallbackData, LocalizationMap, LocaleString, InteractionContextType, Permissions, ApplicationIntegrationType, RESTPostAPIChatInputApplicationCommandsJSONBody, ApplicationCommandOptionType, APIApplicationCommandBasicOption, APIApplicationCommandAttachmentOption, APIApplicationCommandBooleanOption, APIApplicationCommandChannelOption, APIApplicationCommandOptionChoice, APIApplicationCommandIntegerOption, APIApplicationCommandMentionableOption, APIApplicationCommandNumberOption, APIApplicationCommandRoleOption, APIApplicationCommandStringOption, APIApplicationCommandUserOption, APIApplicationCommandSubcommandGroupOption, APIApplicationCommandSubcommandOption, APIApplicationCommandOption, Locale, ApplicationCommandType, RESTPostAPIContextMenuApplicationCommandsJSONBody } from 'discord-api-types/v10'; +import { APIEmbedField, APIEmbedAuthor, APIEmbedFooter, APIEmbedImage, APIEmbed, APISelectMenuOption, APIMessageComponentEmoji, ButtonStyle, ChannelType, APIBaseComponent, ComponentType, APIActionRowComponent, APIComponentInActionRow, APIMessageComponent, APIModalComponent, APIButtonComponent, Snowflake, APISelectMenuComponent, APIChannelSelectComponent, APIMentionableSelectComponent, APISelectMenuDefaultValue, SelectMenuDefaultValueType, APIRoleSelectComponent, APIStringSelectComponent, APIUserSelectComponent, APITextInputComponent, TextInputStyle, APIComponentInMessageActionRow, APIComponentInModalActionRow, APIFileUploadComponent, APILabelComponent, APIFileComponent, APISeparatorComponent, SeparatorSpacingSize, APITextDisplayComponent, APIContainerComponent, APIMediaGalleryComponent, APISectionComponent, APIComponentInContainer, APIMediaGalleryItem, APIThumbnailComponent, APIModalInteractionResponseCallbackData, LocalizationMap, LocaleString, InteractionContextType, Permissions, ApplicationIntegrationType, RESTPostAPIChatInputApplicationCommandsJSONBody, ApplicationCommandOptionType, APIApplicationCommandBasicOption, APIApplicationCommandAttachmentOption, APIApplicationCommandBooleanOption, APIApplicationCommandChannelOption, APIApplicationCommandOptionChoice, APIApplicationCommandIntegerOption, APIApplicationCommandMentionableOption, APIApplicationCommandNumberOption, APIApplicationCommandRoleOption, APIApplicationCommandStringOption, APIApplicationCommandUserOption, APIApplicationCommandSubcommandOption, APIApplicationCommandSubcommandGroupOption, APIApplicationCommandOption, Locale, ApplicationCommandType, RESTPostAPIContextMenuApplicationCommandsJSONBody } from 'discord-api-types/v10'; export * from '@discordjs/formatters'; import { JSONEncodable, Equatable } from '@discordjs/util'; @@ -52,25 +52,25 @@ declare const embedFooterPredicate: _sapphire_shapeshift.ObjectValidator<{ declare const timestampPredicate: _sapphire_shapeshift.UnionValidator; declare const titlePredicate: _sapphire_shapeshift.UnionValidator; -declare const Assertions$6_RGBPredicate: typeof RGBPredicate; -declare const Assertions$6_authorNamePredicate: typeof authorNamePredicate; -declare const Assertions$6_colorPredicate: typeof colorPredicate; -declare const Assertions$6_embedAuthorPredicate: typeof embedAuthorPredicate; -declare const Assertions$6_embedFieldPredicate: typeof embedFieldPredicate; -declare const Assertions$6_embedFieldsArrayPredicate: typeof embedFieldsArrayPredicate; -declare const Assertions$6_embedFooterPredicate: typeof embedFooterPredicate; -declare const Assertions$6_fieldInlinePredicate: typeof fieldInlinePredicate; -declare const Assertions$6_fieldLengthPredicate: typeof fieldLengthPredicate; -declare const Assertions$6_fieldNamePredicate: typeof fieldNamePredicate; -declare const Assertions$6_fieldValuePredicate: typeof fieldValuePredicate; -declare const Assertions$6_footerTextPredicate: typeof footerTextPredicate; -declare const Assertions$6_imageURLPredicate: typeof imageURLPredicate; -declare const Assertions$6_timestampPredicate: typeof timestampPredicate; -declare const Assertions$6_titlePredicate: typeof titlePredicate; -declare const Assertions$6_urlPredicate: typeof urlPredicate; -declare const Assertions$6_validateFieldLength: typeof validateFieldLength; -declare namespace Assertions$6 { - export { Assertions$6_RGBPredicate as RGBPredicate, Assertions$6_authorNamePredicate as authorNamePredicate, Assertions$6_colorPredicate as colorPredicate, descriptionPredicate$1 as descriptionPredicate, Assertions$6_embedAuthorPredicate as embedAuthorPredicate, Assertions$6_embedFieldPredicate as embedFieldPredicate, Assertions$6_embedFieldsArrayPredicate as embedFieldsArrayPredicate, Assertions$6_embedFooterPredicate as embedFooterPredicate, Assertions$6_fieldInlinePredicate as fieldInlinePredicate, Assertions$6_fieldLengthPredicate as fieldLengthPredicate, Assertions$6_fieldNamePredicate as fieldNamePredicate, Assertions$6_fieldValuePredicate as fieldValuePredicate, Assertions$6_footerTextPredicate as footerTextPredicate, Assertions$6_imageURLPredicate as imageURLPredicate, Assertions$6_timestampPredicate as timestampPredicate, Assertions$6_titlePredicate as titlePredicate, Assertions$6_urlPredicate as urlPredicate, Assertions$6_validateFieldLength as validateFieldLength }; +declare const Assertions$9_RGBPredicate: typeof RGBPredicate; +declare const Assertions$9_authorNamePredicate: typeof authorNamePredicate; +declare const Assertions$9_colorPredicate: typeof colorPredicate; +declare const Assertions$9_embedAuthorPredicate: typeof embedAuthorPredicate; +declare const Assertions$9_embedFieldPredicate: typeof embedFieldPredicate; +declare const Assertions$9_embedFieldsArrayPredicate: typeof embedFieldsArrayPredicate; +declare const Assertions$9_embedFooterPredicate: typeof embedFooterPredicate; +declare const Assertions$9_fieldInlinePredicate: typeof fieldInlinePredicate; +declare const Assertions$9_fieldLengthPredicate: typeof fieldLengthPredicate; +declare const Assertions$9_fieldNamePredicate: typeof fieldNamePredicate; +declare const Assertions$9_fieldValuePredicate: typeof fieldValuePredicate; +declare const Assertions$9_footerTextPredicate: typeof footerTextPredicate; +declare const Assertions$9_imageURLPredicate: typeof imageURLPredicate; +declare const Assertions$9_timestampPredicate: typeof timestampPredicate; +declare const Assertions$9_titlePredicate: typeof titlePredicate; +declare const Assertions$9_urlPredicate: typeof urlPredicate; +declare const Assertions$9_validateFieldLength: typeof validateFieldLength; +declare namespace Assertions$9 { + export { Assertions$9_RGBPredicate as RGBPredicate, Assertions$9_authorNamePredicate as authorNamePredicate, Assertions$9_colorPredicate as colorPredicate, descriptionPredicate$1 as descriptionPredicate, Assertions$9_embedAuthorPredicate as embedAuthorPredicate, Assertions$9_embedFieldPredicate as embedFieldPredicate, Assertions$9_embedFieldsArrayPredicate as embedFieldsArrayPredicate, Assertions$9_embedFooterPredicate as embedFooterPredicate, Assertions$9_fieldInlinePredicate as fieldInlinePredicate, Assertions$9_fieldLengthPredicate as fieldLengthPredicate, Assertions$9_fieldNamePredicate as fieldNamePredicate, Assertions$9_fieldValuePredicate as fieldValuePredicate, Assertions$9_footerTextPredicate as footerTextPredicate, Assertions$9_imageURLPredicate as imageURLPredicate, Assertions$9_timestampPredicate as timestampPredicate, Assertions$9_titlePredicate as titlePredicate, Assertions$9_urlPredicate as urlPredicate, Assertions$9_validateFieldLength as validateFieldLength }; } /** @@ -181,7 +181,7 @@ declare class EmbedBuilder { * * @remarks * This method behaves similarly - * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}. + * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}. * The maximum amount of fields that can be added is 25. * * It's useful for modifying and adjusting order of the already-existing fields of an embed. @@ -362,6 +362,9 @@ declare const buttonStyleValidator: _sapphire_shapeshift.NativeEnumValidator; declare const minMaxValidator: _sapphire_shapeshift.NumberValidator; declare const labelValueDescriptionValidator: _sapphire_shapeshift.StringValidator; +/** + * @deprecated Replaced with selectMenuStringOptionPredicate. + */ declare const jsonOptionValidator: _sapphire_shapeshift.ObjectValidator<{ label: string; value: string; @@ -393,32 +396,32 @@ declare const channelTypesValidator: _sapphire_shapeshift.ArrayValidator; declare function validateRequiredButtonParameters(style?: ButtonStyle, label?: string, emoji?: APIMessageComponentEmoji, customId?: string, skuId?: string, url?: string): void; -declare const Assertions$5_buttonLabelValidator: typeof buttonLabelValidator; -declare const Assertions$5_buttonStyleValidator: typeof buttonStyleValidator; -declare const Assertions$5_channelTypesValidator: typeof channelTypesValidator; -declare const Assertions$5_customIdValidator: typeof customIdValidator; -declare const Assertions$5_defaultValidator: typeof defaultValidator; -declare const Assertions$5_disabledValidator: typeof disabledValidator; -declare const Assertions$5_emojiValidator: typeof emojiValidator; -declare const Assertions$5_idValidator: typeof idValidator; -declare const Assertions$5_jsonOptionValidator: typeof jsonOptionValidator; -declare const Assertions$5_labelValueDescriptionValidator: typeof labelValueDescriptionValidator; -declare const Assertions$5_minMaxValidator: typeof minMaxValidator; -declare const Assertions$5_optionValidator: typeof optionValidator; -declare const Assertions$5_optionsLengthValidator: typeof optionsLengthValidator; -declare const Assertions$5_optionsValidator: typeof optionsValidator; -declare const Assertions$5_urlValidator: typeof urlValidator; -declare const Assertions$5_validateRequiredButtonParameters: typeof validateRequiredButtonParameters; -declare const Assertions$5_validateRequiredSelectMenuOptionParameters: typeof validateRequiredSelectMenuOptionParameters; -declare const Assertions$5_validateRequiredSelectMenuParameters: typeof validateRequiredSelectMenuParameters; -declare namespace Assertions$5 { - export { Assertions$5_buttonLabelValidator as buttonLabelValidator, Assertions$5_buttonStyleValidator as buttonStyleValidator, Assertions$5_channelTypesValidator as channelTypesValidator, Assertions$5_customIdValidator as customIdValidator, Assertions$5_defaultValidator as defaultValidator, Assertions$5_disabledValidator as disabledValidator, Assertions$5_emojiValidator as emojiValidator, Assertions$5_idValidator as idValidator, Assertions$5_jsonOptionValidator as jsonOptionValidator, Assertions$5_labelValueDescriptionValidator as labelValueDescriptionValidator, Assertions$5_minMaxValidator as minMaxValidator, Assertions$5_optionValidator as optionValidator, Assertions$5_optionsLengthValidator as optionsLengthValidator, Assertions$5_optionsValidator as optionsValidator, placeholderValidator$1 as placeholderValidator, Assertions$5_urlValidator as urlValidator, Assertions$5_validateRequiredButtonParameters as validateRequiredButtonParameters, Assertions$5_validateRequiredSelectMenuOptionParameters as validateRequiredSelectMenuOptionParameters, Assertions$5_validateRequiredSelectMenuParameters as validateRequiredSelectMenuParameters }; +declare const Assertions$8_buttonLabelValidator: typeof buttonLabelValidator; +declare const Assertions$8_buttonStyleValidator: typeof buttonStyleValidator; +declare const Assertions$8_channelTypesValidator: typeof channelTypesValidator; +declare const Assertions$8_customIdValidator: typeof customIdValidator; +declare const Assertions$8_defaultValidator: typeof defaultValidator; +declare const Assertions$8_disabledValidator: typeof disabledValidator; +declare const Assertions$8_emojiValidator: typeof emojiValidator; +declare const Assertions$8_idValidator: typeof idValidator; +declare const Assertions$8_jsonOptionValidator: typeof jsonOptionValidator; +declare const Assertions$8_labelValueDescriptionValidator: typeof labelValueDescriptionValidator; +declare const Assertions$8_minMaxValidator: typeof minMaxValidator; +declare const Assertions$8_optionValidator: typeof optionValidator; +declare const Assertions$8_optionsLengthValidator: typeof optionsLengthValidator; +declare const Assertions$8_optionsValidator: typeof optionsValidator; +declare const Assertions$8_urlValidator: typeof urlValidator; +declare const Assertions$8_validateRequiredButtonParameters: typeof validateRequiredButtonParameters; +declare const Assertions$8_validateRequiredSelectMenuOptionParameters: typeof validateRequiredSelectMenuOptionParameters; +declare const Assertions$8_validateRequiredSelectMenuParameters: typeof validateRequiredSelectMenuParameters; +declare namespace Assertions$8 { + export { Assertions$8_buttonLabelValidator as buttonLabelValidator, Assertions$8_buttonStyleValidator as buttonStyleValidator, Assertions$8_channelTypesValidator as channelTypesValidator, Assertions$8_customIdValidator as customIdValidator, Assertions$8_defaultValidator as defaultValidator, Assertions$8_disabledValidator as disabledValidator, Assertions$8_emojiValidator as emojiValidator, Assertions$8_idValidator as idValidator, Assertions$8_jsonOptionValidator as jsonOptionValidator, Assertions$8_labelValueDescriptionValidator as labelValueDescriptionValidator, Assertions$8_minMaxValidator as minMaxValidator, Assertions$8_optionValidator as optionValidator, Assertions$8_optionsLengthValidator as optionsLengthValidator, Assertions$8_optionsValidator as optionsValidator, placeholderValidator$1 as placeholderValidator, Assertions$8_urlValidator as urlValidator, Assertions$8_validateRequiredButtonParameters as validateRequiredButtonParameters, Assertions$8_validateRequiredSelectMenuOptionParameters as validateRequiredSelectMenuOptionParameters, Assertions$8_validateRequiredSelectMenuParameters as validateRequiredSelectMenuParameters }; } /** * Any action row component data represented as an object. */ -type AnyAPIActionRowComponent = APIActionRowComponent | APIComponentInActionRow | APIMessageComponent; +type AnyAPIActionRowComponent = APIActionRowComponent | APIComponentInActionRow | APIMessageComponent | APIModalComponent; /** * The base component builder that contains common symbols for all sorts of components. * @@ -561,9 +564,9 @@ declare abstract class BaseSelectMenuBuilder i * ```ts * const textInput = new TextInputBuilder({ * custom_id: 'a cool text input', - * label: 'Type something', + * placeholder: 'Type something', * style: TextInputStyle.Short, * }); * ``` @@ -884,7 +894,7 @@ declare class TextInputBuilder extends ComponentBuilder i * Creating a text input using setters and API data: * ```ts * const textInput = new TextInputBuilder({ - * label: 'Type something else', + * placeholder: 'Type something else', * }) * .setCustomId('woah') * .setStyle(TextInputStyle.Paragraph); @@ -903,6 +913,7 @@ declare class TextInputBuilder extends ComponentBuilder i * Sets the label for this text input. * * @param label - The label to use + * @deprecated Use a label builder to create a label (and optionally a description) instead. */ setLabel(label: string): this; /** @@ -1030,6 +1041,169 @@ declare class ActionRowBuilder extend toJSON(): APIActionRowComponent>; } +/** + * A builder that creates API-compatible JSON data for file uploads. + */ +declare class FileUploadBuilder extends ComponentBuilder { + /** + * Creates a new file upload. + * + * @param data - The API data to create this file upload with + * @example + * Creating a file upload from an API data object: + * ```ts + * const fileUpload = new FileUploadBuilder({ + * custom_id: "file_upload", + * min_values: 2, + * max_values: 5, + * }); + * ``` + * @example + * Creating a file upload using setters and API data: + * ```ts + * const fileUpload = new FileUploadBuilder({ + * custom_id: "file_upload", + * min_values: 2, + * max_values: 5, + * }).setRequired(); + * ``` + */ + constructor(data?: Partial); + /** + * Sets the custom id for this file upload. + * + * @param customId - The custom id to use + */ + setCustomId(customId: string): this; + /** + * Sets the minimum number of file uploads required. + * + * @param minValues - The minimum values that must be uploaded + */ + setMinValues(minValues: number): this; + /** + * Clears the minimum values. + */ + clearMinValues(): this; + /** + * Sets the maximum number of file uploads required. + * + * @param maxValues - The maximum values that can be uploaded + */ + setMaxValues(maxValues: number): this; + /** + * Clears the maximum values. + */ + clearMaxValues(): this; + /** + * Sets whether this file upload is required. + * + * @param required - Whether this file upload is required + */ + setRequired(required?: boolean): this; + /** + * {@inheritDoc ComponentBuilder.toJSON} + */ + toJSON(): APIFileUploadComponent; +} + +interface LabelBuilderData extends Partial> { + component?: ChannelSelectMenuBuilder | FileUploadBuilder | MentionableSelectMenuBuilder | RoleSelectMenuBuilder | StringSelectMenuBuilder | TextInputBuilder | UserSelectMenuBuilder; +} +/** + * A builder that creates API-compatible JSON data for labels. + */ +declare class LabelBuilder extends ComponentBuilder { + /** + * @internal + */ + readonly data: LabelBuilderData; + /** + * Creates a new label. + * + * @param data - The API data to create this label with + * @example + * Creating a label from an API data object: + * ```ts + * const label = new LabelBuilder({ + * label: "label", + * component, + * }); + * ``` + * @example + * Creating a label using setters and API data: + * ```ts + * const label = new LabelBuilder({ + * label: 'label', + * component, + * }).setLabel('new text'); + * ``` + */ + constructor(data?: Partial); + /** + * Sets the label for this label. + * + * @param label - The label to use + */ + setLabel(label: string): this; + /** + * Sets the description for this label. + * + * @param description - The description to use + */ + setDescription(description: string): this; + /** + * Clears the description for this label. + */ + clearDescription(): this; + /** + * Sets a string select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setStringSelectMenuComponent(input: APIStringSelectComponent | StringSelectMenuBuilder | ((builder: StringSelectMenuBuilder) => StringSelectMenuBuilder)): this; + /** + * Sets a user select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setUserSelectMenuComponent(input: APIUserSelectComponent | UserSelectMenuBuilder | ((builder: UserSelectMenuBuilder) => UserSelectMenuBuilder)): this; + /** + * Sets a role select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setRoleSelectMenuComponent(input: APIRoleSelectComponent | RoleSelectMenuBuilder | ((builder: RoleSelectMenuBuilder) => RoleSelectMenuBuilder)): this; + /** + * Sets a mentionable select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setMentionableSelectMenuComponent(input: APIMentionableSelectComponent | MentionableSelectMenuBuilder | ((builder: MentionableSelectMenuBuilder) => MentionableSelectMenuBuilder)): this; + /** + * Sets a channel select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setChannelSelectMenuComponent(input: APIChannelSelectComponent | ChannelSelectMenuBuilder | ((builder: ChannelSelectMenuBuilder) => ChannelSelectMenuBuilder)): this; + /** + * Sets a text input component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setTextInputComponent(input: APITextInputComponent | TextInputBuilder | ((builder: TextInputBuilder) => TextInputBuilder)): this; + /** + * Sets a file upload component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setFileUploadComponent(input: APIFileUploadComponent | FileUploadBuilder | ((builder: FileUploadBuilder) => FileUploadBuilder)): this; + /** + * {@inheritDoc ComponentBuilder.toJSON} + */ + toJSON(): APILabelComponent; +} + declare class FileBuilder extends ComponentBuilder { /** * Creates a new file from API data. @@ -1193,7 +1367,8 @@ declare class ContainerBuilder extends ComponentBuilder { * }, * ], * }) - * .addComponents(separator, section); + * .addSeparatorComponents(separator) + * .addSectionComponents(section); * ``` */ constructor({ components, ...data }?: Partial); @@ -1592,6 +1767,14 @@ interface MappedComponentTypes { * The media gallery component type is associated with a {@link MediaGalleryBuilder}. */ [ComponentType.MediaGallery]: MediaGalleryBuilder; + /** + * The label component type is associated with a {@link LabelBuilder}. + */ + [ComponentType.Label]: LabelBuilder; + /** + * The file upload component type is associated with a {@link FileUploadBuilder}. + */ + [ComponentType.FileUpload]: FileUploadBuilder; } /** * Factory for creating components from API data. @@ -1618,17 +1801,39 @@ 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 textInputPredicate: _sapphire_shapeshift.ObjectValidator<{ + type: ComponentType; + custom_id: string; + style: TextInputStyle; + id: number | undefined; + min_length: number | undefined; + max_length: number | undefined; + placeholder: string | undefined; + value: string | undefined; + required: boolean | undefined; +}, _sapphire_shapeshift.UndefinedToOptional<{ + type: ComponentType; + custom_id: string; + style: TextInputStyle; + id: number | undefined; + min_length: number | undefined; + max_length: number | undefined; + placeholder: string | undefined; + value: string | undefined; + required: boolean | undefined; +}>>; +declare function validateRequiredParameters$3(customId?: string, style?: TextInputStyle): void; -declare const Assertions$4_labelValidator: typeof labelValidator; -declare const Assertions$4_maxLengthValidator: typeof maxLengthValidator; -declare const Assertions$4_minLengthValidator: typeof minLengthValidator; -declare const Assertions$4_placeholderValidator: typeof placeholderValidator; -declare const Assertions$4_requiredValidator: typeof requiredValidator; -declare const Assertions$4_textInputStyleValidator: typeof textInputStyleValidator; -declare const Assertions$4_valueValidator: typeof valueValidator; -declare namespace Assertions$4 { - export { Assertions$4_labelValidator as labelValidator, Assertions$4_maxLengthValidator as maxLengthValidator, Assertions$4_minLengthValidator as minLengthValidator, Assertions$4_placeholderValidator as placeholderValidator, Assertions$4_requiredValidator as requiredValidator, Assertions$4_textInputStyleValidator as textInputStyleValidator, validateRequiredParameters$3 as validateRequiredParameters, Assertions$4_valueValidator as valueValidator }; +declare const Assertions$7_labelValidator: typeof labelValidator; +declare const Assertions$7_maxLengthValidator: typeof maxLengthValidator; +declare const Assertions$7_minLengthValidator: typeof minLengthValidator; +declare const Assertions$7_placeholderValidator: typeof placeholderValidator; +declare const Assertions$7_requiredValidator: typeof requiredValidator; +declare const Assertions$7_textInputPredicate: typeof textInputPredicate; +declare const Assertions$7_textInputStyleValidator: typeof textInputStyleValidator; +declare const Assertions$7_valueValidator: typeof valueValidator; +declare namespace Assertions$7 { + export { Assertions$7_labelValidator as labelValidator, Assertions$7_maxLengthValidator as maxLengthValidator, Assertions$7_minLengthValidator as minLengthValidator, Assertions$7_placeholderValidator as placeholderValidator, Assertions$7_requiredValidator as requiredValidator, Assertions$7_textInputPredicate as textInputPredicate, Assertions$7_textInputStyleValidator as textInputStyleValidator, validateRequiredParameters$3 as validateRequiredParameters, Assertions$7_valueValidator as valueValidator }; } /** @@ -1642,7 +1847,7 @@ declare class ModalBuilder implements JSONEncodable[]; + readonly components: (ActionRowBuilder | LabelBuilder | TextDisplayBuilder)[]; /** * Creates a new modal from API data. * @@ -1665,14 +1870,71 @@ declare class ModalBuilder implements JSONEncodable | APIActionRowComponent>): this; + addComponents(...components: RestOrArray | APIActionRowComponent | APILabelComponent | APITextDisplayComponent | APITextInputComponent | LabelBuilder | TextDisplayBuilder | TextInputBuilder>): this; + /** + * Adds label components to this modal. + * + * @param components - The components to add + */ + addLabelComponents(...components: RestOrArray LabelBuilder)>): this; + /** + * Adds text display components to this modal. + * + * @param components - The components to add + */ + addTextDisplayComponents(...components: RestOrArray TextDisplayBuilder)>): this; + /** + * Adds action rows to this modal. + * + * @param components - The components to add + * @deprecated Use {@link ModalBuilder.addLabelComponents} instead + */ + addActionRowComponents(...components: RestOrArray | APIActionRowComponent | ((builder: ActionRowBuilder) => ActionRowBuilder)>): this; + /** + * Sets the labels for this modal. + * + * @param components - The components to set + */ + setLabelComponents(...components: RestOrArray LabelBuilder)>): this; + /** + * Removes, replaces, or inserts labels for this modal. + * + * @remarks + * This method behaves similarly + * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}. + * The maximum amount of labels that can be added is 5. + * + * It's useful for modifying and adjusting order of the already-existing labels of a modal. + * @example + * Remove the first label: + * ```ts + * modal.spliceLabelComponents(0, 1); + * ``` + * @example + * Remove the first n labels: + * ```ts + * const n = 4; + * modal.spliceLabelComponents(0, n); + * ``` + * @example + * Remove the last label: + * ```ts + * modal.spliceLabelComponents(-1, 1); + * ``` + * @param index - The index to start at + * @param deleteCount - The number of labels to remove + * @param labels - The replacing label objects + */ + spliceLabelComponents(index: number, deleteCount: number, ...labels: (APILabelComponent | LabelBuilder | ((builder: LabelBuilder) => LabelBuilder))[]): this; /** * Sets components for this modal. * * @param components - The components to set + * @deprecated Use {@link ModalBuilder.setLabelComponents} instead */ - setComponents(...components: RestOrArray>): this; + setComponents(...components: RestOrArray | LabelBuilder | TextDisplayBuilder>): this; /** * {@inheritDoc ComponentBuilder.toJSON} */ @@ -1680,13 +1942,11966 @@ declare class ModalBuilder implements JSONEncodable; -declare const componentsValidator: _sapphire_shapeshift.ArrayValidator<[ActionRowBuilder, ...ActionRowBuilder[]], ActionRowBuilder>; -declare function validateRequiredParameters$2(customId?: string, title?: string, components?: ActionRowBuilder[]): void; +declare const componentsValidator: _sapphire_shapeshift.ArrayValidator<[LabelBuilder | ActionRowBuilder | TextDisplayBuilder, ...(LabelBuilder | ActionRowBuilder | TextDisplayBuilder)[]], LabelBuilder | ActionRowBuilder | TextDisplayBuilder>; +declare function validateRequiredParameters$2(customId?: string, title?: string, components?: (ActionRowBuilder | LabelBuilder | TextDisplayBuilder)[]): void; -declare const Assertions$3_componentsValidator: typeof componentsValidator; -declare const Assertions$3_titleValidator: typeof titleValidator; +declare const Assertions$6_componentsValidator: typeof componentsValidator; +declare const Assertions$6_titleValidator: typeof titleValidator; +declare namespace Assertions$6 { + export { Assertions$6_componentsValidator as componentsValidator, Assertions$6_titleValidator as titleValidator, validateRequiredParameters$2 as validateRequiredParameters }; +} + +declare const selectMenuChannelPredicate: _sapphire_shapeshift.ObjectValidator<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + channel_types: ChannelType[] | undefined; + default_values: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | undefined; +}, _sapphire_shapeshift.UndefinedToOptional<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + channel_types: ChannelType[] | undefined; + default_values: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | undefined; +}>>; +declare const selectMenuMentionablePredicate: _sapphire_shapeshift.ObjectValidator<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + default_values: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | undefined; +}, _sapphire_shapeshift.UndefinedToOptional<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + default_values: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | undefined; +}>>; +declare const selectMenuRolePredicate: _sapphire_shapeshift.ObjectValidator<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + default_values: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | undefined; +}, _sapphire_shapeshift.UndefinedToOptional<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + default_values: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | undefined; +}>>; +declare const selectMenuUserPredicate: _sapphire_shapeshift.ObjectValidator<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + default_values: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | undefined; +}, _sapphire_shapeshift.UndefinedToOptional<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + default_values: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + type: any; + }>] | undefined; +}>>; +declare const selectMenuStringOptionPredicate: _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 selectMenuStringPredicate: _sapphire_shapeshift.ObjectValidator<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + options: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>]; +}, _sapphire_shapeshift.UndefinedToOptional<{ + id: number | undefined; + placeholder: string | undefined; + min_values: number | undefined; + max_values: number | undefined; + custom_id: string; + disabled: boolean | undefined; +} & { + type: ComponentType; + options: [] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>] | [_sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>, _sapphire_shapeshift.UndefinedToOptional<{ + label: any; + value: any; + description: any; + emoji: any; + default: any; + }>]; +}>>; + +declare const Assertions$5_selectMenuChannelPredicate: typeof selectMenuChannelPredicate; +declare const Assertions$5_selectMenuMentionablePredicate: typeof selectMenuMentionablePredicate; +declare const Assertions$5_selectMenuRolePredicate: typeof selectMenuRolePredicate; +declare const Assertions$5_selectMenuStringOptionPredicate: typeof selectMenuStringOptionPredicate; +declare const Assertions$5_selectMenuStringPredicate: typeof selectMenuStringPredicate; +declare const Assertions$5_selectMenuUserPredicate: typeof selectMenuUserPredicate; +declare namespace Assertions$5 { + export { Assertions$5_selectMenuChannelPredicate as selectMenuChannelPredicate, Assertions$5_selectMenuMentionablePredicate as selectMenuMentionablePredicate, Assertions$5_selectMenuRolePredicate as selectMenuRolePredicate, Assertions$5_selectMenuStringOptionPredicate as selectMenuStringOptionPredicate, Assertions$5_selectMenuStringPredicate as selectMenuStringPredicate, Assertions$5_selectMenuUserPredicate as selectMenuUserPredicate }; +} + +declare const fileUploadPredicate: _sapphire_shapeshift.ObjectValidator<{ + type: ComponentType; + id: number | undefined; + custom_id: string; + min_values: number | undefined; + max_values: number | undefined; + required: boolean | undefined; +}, _sapphire_shapeshift.UndefinedToOptional<{ + type: ComponentType; + id: number | undefined; + custom_id: string; + min_values: number | undefined; + max_values: number | undefined; + required: boolean | undefined; +}>>; + +declare const Assertions$4_fileUploadPredicate: typeof fileUploadPredicate; +declare namespace Assertions$4 { + export { Assertions$4_fileUploadPredicate as fileUploadPredicate }; +} + +declare const labelPredicate: _sapphire_shapeshift.ObjectValidator<{ + id: number | undefined; + type: ComponentType; + label: string; + description: string | undefined; + component: _sapphire_shapeshift.UndefinedToOptional<{ + type: any; + id: any; + custom_id: any; + min_values: any; + max_values: any; + required: any; + }> | _sapphire_shapeshift.UndefinedToOptional<{ + type: any; + custom_id: any; + style: any; + id: any; + min_length: any; + max_length: any; + placeholder: any; + value: any; + required: any; + }> | _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + placeholder: any; + min_values: any; + max_values: any; + custom_id: any; + disabled: any; + } & { + type: any; + default_values: any; + }> | _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + placeholder: any; + min_values: any; + max_values: any; + custom_id: any; + disabled: any; + } & { + type: any; + options: any; + }>; +}, _sapphire_shapeshift.UndefinedToOptional<{ + id: number | undefined; + type: ComponentType; + label: string; + description: string | undefined; + component: _sapphire_shapeshift.UndefinedToOptional<{ + type: any; + id: any; + custom_id: any; + min_values: any; + max_values: any; + required: any; + }> | _sapphire_shapeshift.UndefinedToOptional<{ + type: any; + custom_id: any; + style: any; + id: any; + min_length: any; + max_length: any; + placeholder: any; + value: any; + required: any; + }> | _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + placeholder: any; + min_values: any; + max_values: any; + custom_id: any; + disabled: any; + } & { + type: any; + default_values: any; + }> | _sapphire_shapeshift.UndefinedToOptional<{ + id: any; + placeholder: any; + min_values: any; + max_values: any; + custom_id: any; + disabled: any; + } & { + type: any; + options: any; + }>; +}>>; + +declare const Assertions$3_labelPredicate: typeof labelPredicate; declare namespace Assertions$3 { - export { Assertions$3_componentsValidator as componentsValidator, Assertions$3_titleValidator as titleValidator, validateRequiredParameters$2 as validateRequiredParameters }; + export { Assertions$3_labelPredicate as labelPredicate }; } declare const unfurledMediaItemPredicate: _sapphire_shapeshift.ObjectValidator<{ @@ -2608,4 +14823,4 @@ declare function isValidationEnabled(): boolean; */ declare const version: string; -export { ActionRowBuilder, type AnyAPIActionRowComponent, type AnyComponentBuilder, ApplicationCommandNumericOptionMinMaxValueMixin, type ApplicationCommandOptionAllowedChannelTypes, ApplicationCommandOptionBase, ApplicationCommandOptionChannelTypesMixin, ApplicationCommandOptionWithAutocompleteMixin, ApplicationCommandOptionWithChoicesMixin, BaseSelectMenuBuilder, ButtonBuilder, ChannelSelectMenuBuilder, Assertions$5 as ComponentAssertions, ComponentBuilder, Assertions$2 as ComponentsV2Assertions, ContainerBuilder, type ContainerComponentBuilder, Assertions as ContextMenuCommandAssertions, ContextMenuCommandBuilder, type ContextMenuCommandType, Assertions$6 as EmbedAssertions, type EmbedAuthorData, type EmbedAuthorOptions, EmbedBuilder, type EmbedFooterData, type EmbedFooterOptions, type EmbedImageData, FileBuilder, type IconData, type MappedComponentTypes, MediaGalleryBuilder, MediaGalleryItemBuilder, MentionableSelectMenuBuilder, type MessageActionRowComponentBuilder, type MessageComponentBuilder, type ModalActionRowComponentBuilder, Assertions$3 as ModalAssertions, ModalBuilder, type ModalComponentBuilder, type RGBTuple, type RestOrArray, RoleSelectMenuBuilder, SectionBuilder, StringSelectMenuBuilder as SelectMenuBuilder, StringSelectMenuOptionBuilder as SelectMenuOptionBuilder, SeparatorBuilder, SharedNameAndDescription, SharedSlashCommand, SharedSlashCommandOptions, SharedSlashCommandSubcommands, Assertions$1 as SlashCommandAssertions, SlashCommandAttachmentOption, SlashCommandBooleanOption, SlashCommandBuilder, SlashCommandChannelOption, SlashCommandIntegerOption, SlashCommandMentionableOption, SlashCommandNumberOption, type SlashCommandOptionsOnlyBuilder, SlashCommandRoleOption, SlashCommandStringOption, SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder, type SlashCommandSubcommandsOnlyBuilder, SlashCommandUserOption, StringSelectMenuBuilder, StringSelectMenuOptionBuilder, TextDisplayBuilder, Assertions$4 as TextInputAssertions, TextInputBuilder, ThumbnailBuilder, type ToAPIApplicationCommandOptions, UserSelectMenuBuilder, createComponentBuilder, disableValidators, embedLength, enableValidators, isValidationEnabled, normalizeArray, resolveBuilder, version }; +export { ActionRowBuilder, type AnyAPIActionRowComponent, type AnyComponentBuilder, ApplicationCommandNumericOptionMinMaxValueMixin, type ApplicationCommandOptionAllowedChannelTypes, ApplicationCommandOptionBase, ApplicationCommandOptionChannelTypesMixin, ApplicationCommandOptionWithAutocompleteMixin, ApplicationCommandOptionWithChoicesMixin, BaseSelectMenuBuilder, ButtonBuilder, ChannelSelectMenuBuilder, Assertions$8 as ComponentAssertions, ComponentBuilder, Assertions$2 as ComponentsV2Assertions, ContainerBuilder, type ContainerComponentBuilder, Assertions as ContextMenuCommandAssertions, ContextMenuCommandBuilder, type ContextMenuCommandType, Assertions$9 as EmbedAssertions, type EmbedAuthorData, type EmbedAuthorOptions, EmbedBuilder, type EmbedFooterData, type EmbedFooterOptions, type EmbedImageData, FileBuilder, Assertions$4 as FileUploadAssertions, FileUploadBuilder, type IconData, Assertions$3 as LabelAssertions, LabelBuilder, type LabelBuilderData, type MappedComponentTypes, MediaGalleryBuilder, MediaGalleryItemBuilder, MentionableSelectMenuBuilder, type MessageActionRowComponentBuilder, type MessageComponentBuilder, type ModalActionRowComponentBuilder, Assertions$6 as ModalAssertions, ModalBuilder, type ModalComponentBuilder, type RGBTuple, type RestOrArray, RoleSelectMenuBuilder, SectionBuilder, Assertions$5 as SelectMenuAssertions, StringSelectMenuBuilder as SelectMenuBuilder, StringSelectMenuOptionBuilder as SelectMenuOptionBuilder, SeparatorBuilder, SharedNameAndDescription, SharedSlashCommand, SharedSlashCommandOptions, SharedSlashCommandSubcommands, Assertions$1 as SlashCommandAssertions, SlashCommandAttachmentOption, SlashCommandBooleanOption, SlashCommandBuilder, SlashCommandChannelOption, SlashCommandIntegerOption, SlashCommandMentionableOption, SlashCommandNumberOption, type SlashCommandOptionsOnlyBuilder, SlashCommandRoleOption, SlashCommandStringOption, SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder, type SlashCommandSubcommandsOnlyBuilder, SlashCommandUserOption, StringSelectMenuBuilder, StringSelectMenuOptionBuilder, TextDisplayBuilder, Assertions$7 as TextInputAssertions, TextInputBuilder, ThumbnailBuilder, type ToAPIApplicationCommandOptions, UserSelectMenuBuilder, createComponentBuilder, disableValidators, embedLength, enableValidators, isValidationEnabled, normalizeArray, resolveBuilder, version }; diff --git a/node_modules/@discordjs/builders/dist/index.js b/node_modules/@discordjs/builders/dist/index.js index 7c929c3..4d6d43e 100644 --- a/node_modules/@discordjs/builders/dist/index.js +++ b/node_modules/@discordjs/builders/dist/index.js @@ -38,8 +38,8 @@ var __decorateClass = (decorators, target, key, kind) => { }; // src/index.ts -var src_exports = {}; -__export(src_exports, { +var index_exports = {}; +__export(index_exports, { ActionRowBuilder: () => ActionRowBuilder, ApplicationCommandNumericOptionMinMaxValueMixin: () => ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionBase: () => ApplicationCommandOptionBase, @@ -51,20 +51,25 @@ __export(src_exports, { ChannelSelectMenuBuilder: () => ChannelSelectMenuBuilder, ComponentAssertions: () => Assertions_exports2, ComponentBuilder: () => ComponentBuilder, - ComponentsV2Assertions: () => Assertions_exports4, + ComponentsV2Assertions: () => Assertions_exports7, ContainerBuilder: () => ContainerBuilder, - ContextMenuCommandAssertions: () => Assertions_exports7, + ContextMenuCommandAssertions: () => Assertions_exports10, ContextMenuCommandBuilder: () => ContextMenuCommandBuilder, EmbedAssertions: () => Assertions_exports, EmbedBuilder: () => EmbedBuilder, FileBuilder: () => FileBuilder, + FileUploadAssertions: () => Assertions_exports3, + FileUploadBuilder: () => FileUploadBuilder, + LabelAssertions: () => Assertions_exports6, + LabelBuilder: () => LabelBuilder, MediaGalleryBuilder: () => MediaGalleryBuilder, MediaGalleryItemBuilder: () => MediaGalleryItemBuilder, MentionableSelectMenuBuilder: () => MentionableSelectMenuBuilder, - ModalAssertions: () => Assertions_exports5, + ModalAssertions: () => Assertions_exports8, ModalBuilder: () => ModalBuilder, RoleSelectMenuBuilder: () => RoleSelectMenuBuilder, SectionBuilder: () => SectionBuilder, + SelectMenuAssertions: () => Assertions_exports5, SelectMenuBuilder: () => StringSelectMenuBuilder, SelectMenuOptionBuilder: () => StringSelectMenuOptionBuilder, SeparatorBuilder: () => SeparatorBuilder, @@ -72,7 +77,7 @@ __export(src_exports, { SharedSlashCommand: () => SharedSlashCommand, SharedSlashCommandOptions: () => SharedSlashCommandOptions, SharedSlashCommandSubcommands: () => SharedSlashCommandSubcommands, - SlashCommandAssertions: () => Assertions_exports6, + SlashCommandAssertions: () => Assertions_exports9, SlashCommandAttachmentOption: () => SlashCommandAttachmentOption, SlashCommandBooleanOption: () => SlashCommandBooleanOption, SlashCommandBuilder: () => SlashCommandBuilder, @@ -88,7 +93,7 @@ __export(src_exports, { StringSelectMenuBuilder: () => StringSelectMenuBuilder, StringSelectMenuOptionBuilder: () => StringSelectMenuOptionBuilder, TextDisplayBuilder: () => TextDisplayBuilder, - TextInputAssertions: () => Assertions_exports3, + TextInputAssertions: () => Assertions_exports4, TextInputBuilder: () => TextInputBuilder, ThumbnailBuilder: () => ThumbnailBuilder, UserSelectMenuBuilder: () => UserSelectMenuBuilder, @@ -101,7 +106,7 @@ __export(src_exports, { resolveBuilder: () => resolveBuilder, version: () => version }); -module.exports = __toCommonJS(src_exports); +module.exports = __toCommonJS(index_exports); // src/messages/embed/Assertions.ts var Assertions_exports = {}; @@ -242,7 +247,7 @@ var EmbedBuilder = class { * * @remarks * This method behaves similarly - * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}. + * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}. * The maximum amount of fields that can be added is 25. * * It's useful for modifying and adjusting order of the already-existing fields of an embed. @@ -403,7 +408,7 @@ var EmbedBuilder = class { }; // src/index.ts -__reExport(src_exports, require("@discordjs/formatters"), module.exports); +__reExport(index_exports, require("@discordjs/formatters"), module.exports); // src/components/Assertions.ts var Assertions_exports2 = {}; @@ -586,7 +591,7 @@ function validateRequiredButtonParameters(style, label, emoji, customId, skuId, __name(validateRequiredButtonParameters, "validateRequiredButtonParameters"); // src/components/ActionRow.ts -var import_v1019 = require("discord-api-types/v10"); +var import_v1024 = require("discord-api-types/v10"); // src/components/Component.ts var ComponentBuilder = class { @@ -624,7 +629,7 @@ var ComponentBuilder = class { }; // src/components/Components.ts -var import_v1018 = require("discord-api-types/v10"); +var import_v1023 = require("discord-api-types/v10"); // src/components/button/Button.ts var import_v102 = require("discord-api-types/v10"); @@ -750,8 +755,159 @@ var ButtonBuilder = class extends ComponentBuilder { } }; -// src/components/selectMenu/ChannelSelectMenu.ts +// src/components/fileUpload/FileUpload.ts +var import_v104 = require("discord-api-types/v10"); + +// src/components/fileUpload/Assertions.ts +var Assertions_exports3 = {}; +__export(Assertions_exports3, { + fileUploadPredicate: () => fileUploadPredicate +}); +var import_shapeshift3 = require("@sapphire/shapeshift"); var import_v103 = require("discord-api-types/v10"); +var fileUploadPredicate = import_shapeshift3.s.object({ + type: import_shapeshift3.s.literal(import_v103.ComponentType.FileUpload), + id: idValidator.optional(), + custom_id: customIdValidator, + min_values: import_shapeshift3.s.number().greaterThanOrEqual(0).lessThanOrEqual(10).optional(), + max_values: import_shapeshift3.s.number().greaterThanOrEqual(1).lessThanOrEqual(10).optional(), + required: import_shapeshift3.s.boolean().optional() +}); + +// src/components/fileUpload/FileUpload.ts +var FileUploadBuilder = class extends ComponentBuilder { + static { + __name(this, "FileUploadBuilder"); + } + /** + * Creates a new file upload. + * + * @param data - The API data to create this file upload with + * @example + * Creating a file upload from an API data object: + * ```ts + * const fileUpload = new FileUploadBuilder({ + * custom_id: "file_upload", + * min_values: 2, + * max_values: 5, + * }); + * ``` + * @example + * Creating a file upload using setters and API data: + * ```ts + * const fileUpload = new FileUploadBuilder({ + * custom_id: "file_upload", + * min_values: 2, + * max_values: 5, + * }).setRequired(); + * ``` + */ + constructor(data = {}) { + super({ type: import_v104.ComponentType.FileUpload, ...data }); + } + /** + * Sets the custom id for this file upload. + * + * @param customId - The custom id to use + */ + setCustomId(customId) { + this.data.custom_id = customId; + return this; + } + /** + * Sets the minimum number of file uploads required. + * + * @param minValues - The minimum values that must be uploaded + */ + setMinValues(minValues) { + this.data.min_values = minValues; + return this; + } + /** + * Clears the minimum values. + */ + clearMinValues() { + this.data.min_values = void 0; + return this; + } + /** + * Sets the maximum number of file uploads required. + * + * @param maxValues - The maximum values that can be uploaded + */ + setMaxValues(maxValues) { + this.data.max_values = maxValues; + return this; + } + /** + * Clears the maximum values. + */ + clearMaxValues() { + this.data.max_values = void 0; + return this; + } + /** + * Sets whether this file upload is required. + * + * @param required - Whether this file upload is required + */ + setRequired(required = true) { + this.data.required = required; + return this; + } + /** + * {@inheritDoc ComponentBuilder.toJSON} + */ + toJSON() { + fileUploadPredicate.parse(this.data); + return this.data; + } +}; + +// src/components/label/Label.ts +var import_v1014 = require("discord-api-types/v10"); + +// src/components/selectMenu/ChannelSelectMenu.ts +var import_v106 = require("discord-api-types/v10"); + +// src/components/textInput/Assertions.ts +var Assertions_exports4 = {}; +__export(Assertions_exports4, { + labelValidator: () => labelValidator, + maxLengthValidator: () => maxLengthValidator, + minLengthValidator: () => minLengthValidator, + placeholderValidator: () => placeholderValidator2, + requiredValidator: () => requiredValidator, + textInputPredicate: () => textInputPredicate, + textInputStyleValidator: () => textInputStyleValidator, + validateRequiredParameters: () => validateRequiredParameters, + valueValidator: () => valueValidator +}); +var import_shapeshift4 = require("@sapphire/shapeshift"); +var import_v105 = require("discord-api-types/v10"); +var textInputStyleValidator = import_shapeshift4.s.nativeEnum(import_v105.TextInputStyle).setValidationEnabled(isValidationEnabled); +var minLengthValidator = import_shapeshift4.s.number().int().greaterThanOrEqual(0).lessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled); +var maxLengthValidator = import_shapeshift4.s.number().int().greaterThanOrEqual(1).lessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled); +var requiredValidator = import_shapeshift4.s.boolean().setValidationEnabled(isValidationEnabled); +var valueValidator = import_shapeshift4.s.string().lengthLessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled); +var placeholderValidator2 = import_shapeshift4.s.string().lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled); +var labelValidator = import_shapeshift4.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45).setValidationEnabled(isValidationEnabled); +var textInputPredicate = import_shapeshift4.s.object({ + type: import_shapeshift4.s.literal(import_v105.ComponentType.TextInput), + custom_id: customIdValidator, + style: textInputStyleValidator, + id: idValidator.optional(), + min_length: minLengthValidator.optional(), + max_length: maxLengthValidator.optional(), + placeholder: placeholderValidator2.optional(), + value: valueValidator.optional(), + required: requiredValidator.optional() +}).setValidationEnabled(isValidationEnabled); +function validateRequiredParameters(customId, style) { + customIdValidator.parse(customId); + textInputStyleValidator.parse(style); +} +__name(validateRequiredParameters, "validateRequiredParameters"); // src/components/selectMenu/BaseSelectMenu.ts var BaseSelectMenuBuilder = class extends ComponentBuilder { @@ -777,9 +933,9 @@ var BaseSelectMenuBuilder = class extends ComponentBuilder { return this; } /** - * Sets the maximum values that must be selected in the select menu. + * Sets the maximum values that can be selected in the select menu. * - * @param maxValues - The maximum values that must be selected + * @param maxValues - The maximum values that can be selected */ setMaxValues(maxValues) { this.data.max_values = minMaxValidator.parse(maxValues); @@ -803,6 +959,16 @@ var BaseSelectMenuBuilder = class extends ComponentBuilder { this.data.disabled = disabledValidator.parse(disabled); return this; } + /** + * Sets whether this select menu is required. + * + * @remarks Only for use in modals. + * @param required - Whether this select menu is required + */ + setRequired(required = true) { + this.data.required = requiredValidator.parse(required); + return this; + } /** * {@inheritDoc ComponentBuilder.toJSON} */ @@ -843,7 +1009,7 @@ var ChannelSelectMenuBuilder = class extends BaseSelectMenuBuilder { * ``` */ constructor(data) { - super({ ...data, type: import_v103.ComponentType.ChannelSelect }); + super({ ...data, type: import_v106.ComponentType.ChannelSelect }); } /** * Adds channel types to this select menu. @@ -879,7 +1045,7 @@ var ChannelSelectMenuBuilder = class extends BaseSelectMenuBuilder { this.data.default_values.push( ...normalizedValues.map((id) => ({ id, - type: import_v103.SelectMenuDefaultValueType.Channel + type: import_v106.SelectMenuDefaultValueType.Channel })) ); return this; @@ -894,7 +1060,7 @@ var ChannelSelectMenuBuilder = class extends BaseSelectMenuBuilder { optionsLengthValidator.parse(normalizedValues.length); this.data.default_values = normalizedValues.map((id) => ({ id, - type: import_v103.SelectMenuDefaultValueType.Channel + type: import_v106.SelectMenuDefaultValueType.Channel })); return this; } @@ -910,7 +1076,7 @@ var ChannelSelectMenuBuilder = class extends BaseSelectMenuBuilder { }; // src/components/selectMenu/MentionableSelectMenu.ts -var import_v104 = require("discord-api-types/v10"); +var import_v107 = require("discord-api-types/v10"); var MentionableSelectMenuBuilder = class extends BaseSelectMenuBuilder { static { __name(this, "MentionableSelectMenuBuilder"); @@ -938,7 +1104,7 @@ var MentionableSelectMenuBuilder = class extends BaseSelectMenuBuilder { * ``` */ constructor(data) { - super({ ...data, type: import_v104.ComponentType.MentionableSelect }); + super({ ...data, type: import_v107.ComponentType.MentionableSelect }); } /** * Adds default roles to this auto populated select menu. @@ -952,7 +1118,7 @@ var MentionableSelectMenuBuilder = class extends BaseSelectMenuBuilder { this.data.default_values.push( ...normalizedValues.map((id) => ({ id, - type: import_v104.SelectMenuDefaultValueType.Role + type: import_v107.SelectMenuDefaultValueType.Role })) ); return this; @@ -969,7 +1135,7 @@ var MentionableSelectMenuBuilder = class extends BaseSelectMenuBuilder { this.data.default_values.push( ...normalizedValues.map((id) => ({ id, - type: import_v104.SelectMenuDefaultValueType.User + type: import_v107.SelectMenuDefaultValueType.User })) ); return this; @@ -1000,7 +1166,7 @@ var MentionableSelectMenuBuilder = class extends BaseSelectMenuBuilder { }; // src/components/selectMenu/RoleSelectMenu.ts -var import_v105 = require("discord-api-types/v10"); +var import_v108 = require("discord-api-types/v10"); var RoleSelectMenuBuilder = class extends BaseSelectMenuBuilder { static { __name(this, "RoleSelectMenuBuilder"); @@ -1028,7 +1194,7 @@ var RoleSelectMenuBuilder = class extends BaseSelectMenuBuilder { * ``` */ constructor(data) { - super({ ...data, type: import_v105.ComponentType.RoleSelect }); + super({ ...data, type: import_v108.ComponentType.RoleSelect }); } /** * Adds default roles to this auto populated select menu. @@ -1042,7 +1208,7 @@ var RoleSelectMenuBuilder = class extends BaseSelectMenuBuilder { this.data.default_values.push( ...normalizedValues.map((id) => ({ id, - type: import_v105.SelectMenuDefaultValueType.Role + type: import_v108.SelectMenuDefaultValueType.Role })) ); return this; @@ -1057,14 +1223,78 @@ var RoleSelectMenuBuilder = class extends BaseSelectMenuBuilder { optionsLengthValidator.parse(normalizedValues.length); this.data.default_values = normalizedValues.map((id) => ({ id, - type: import_v105.SelectMenuDefaultValueType.Role + type: import_v108.SelectMenuDefaultValueType.Role })); return this; } }; // src/components/selectMenu/StringSelectMenu.ts -var import_v106 = require("discord-api-types/v10"); +var import_v1010 = require("discord-api-types/v10"); + +// src/components/selectMenu/Assertions.ts +var Assertions_exports5 = {}; +__export(Assertions_exports5, { + selectMenuChannelPredicate: () => selectMenuChannelPredicate, + selectMenuMentionablePredicate: () => selectMenuMentionablePredicate, + selectMenuRolePredicate: () => selectMenuRolePredicate, + selectMenuStringOptionPredicate: () => selectMenuStringOptionPredicate, + selectMenuStringPredicate: () => selectMenuStringPredicate, + selectMenuUserPredicate: () => selectMenuUserPredicate +}); +var import_shapeshift5 = require("@sapphire/shapeshift"); +var import_v109 = require("discord-api-types/v10"); +var selectMenuBasePredicate = import_shapeshift5.s.object({ + id: idValidator.optional(), + placeholder: import_shapeshift5.s.string().lengthLessThanOrEqual(150).optional(), + min_values: import_shapeshift5.s.number().greaterThanOrEqual(0).lessThanOrEqual(25).optional(), + max_values: import_shapeshift5.s.number().greaterThanOrEqual(0).lessThanOrEqual(25).optional(), + custom_id: customIdValidator, + disabled: import_shapeshift5.s.boolean().optional() +}); +var selectMenuChannelPredicate = selectMenuBasePredicate.extend({ + type: import_shapeshift5.s.literal(import_v109.ComponentType.ChannelSelect), + channel_types: import_shapeshift5.s.nativeEnum(import_v109.ChannelType).array().optional(), + default_values: import_shapeshift5.s.object({ id: import_shapeshift5.s.string(), type: import_shapeshift5.s.literal(import_v109.SelectMenuDefaultValueType.Channel) }).array().lengthLessThanOrEqual(25).optional() +}).setValidationEnabled(isValidationEnabled); +var selectMenuMentionablePredicate = selectMenuBasePredicate.extend({ + type: import_shapeshift5.s.literal(import_v109.ComponentType.MentionableSelect), + default_values: import_shapeshift5.s.object({ + id: import_shapeshift5.s.string(), + type: import_shapeshift5.s.union([import_shapeshift5.s.literal(import_v109.SelectMenuDefaultValueType.Role), import_shapeshift5.s.literal(import_v109.SelectMenuDefaultValueType.User)]) + }).array().lengthLessThanOrEqual(25).optional() +}).setValidationEnabled(isValidationEnabled); +var selectMenuRolePredicate = selectMenuBasePredicate.extend({ + type: import_shapeshift5.s.literal(import_v109.ComponentType.RoleSelect), + default_values: import_shapeshift5.s.object({ id: import_shapeshift5.s.string(), type: import_shapeshift5.s.literal(import_v109.SelectMenuDefaultValueType.Role) }).array().lengthLessThanOrEqual(25).optional() +}).setValidationEnabled(isValidationEnabled); +var selectMenuUserPredicate = selectMenuBasePredicate.extend({ + type: import_shapeshift5.s.literal(import_v109.ComponentType.UserSelect), + default_values: import_shapeshift5.s.object({ id: import_shapeshift5.s.string(), type: import_shapeshift5.s.literal(import_v109.SelectMenuDefaultValueType.User) }).array().lengthLessThanOrEqual(25).optional() +}).setValidationEnabled(isValidationEnabled); +var selectMenuStringOptionPredicate = import_shapeshift5.s.object({ + label: import_shapeshift5.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100), + value: import_shapeshift5.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100), + description: import_shapeshift5.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).optional(), + emoji: emojiValidator.optional(), + default: import_shapeshift5.s.boolean().optional() +}).setValidationEnabled(isValidationEnabled); +var selectMenuStringPredicate = selectMenuBasePredicate.extend({ + type: import_shapeshift5.s.literal(import_v109.ComponentType.StringSelect), + options: selectMenuStringOptionPredicate.array().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(25) +}).reshape((value) => { + if (value.min_values !== void 0 && value.options.length < value.min_values) { + return import_shapeshift5.Result.err(new RangeError(`The number of options must be greater than or equal to min_values`)); + } + if (value.min_values !== void 0 && value.max_values !== void 0 && value.min_values > value.max_values) { + return import_shapeshift5.Result.err( + new RangeError(`The maximum amount of options must be greater than or equal to the minimum amount of options`) + ); + } + return import_shapeshift5.Result.ok(value); +}).setValidationEnabled(isValidationEnabled); + +// src/components/selectMenu/StringSelectMenu.ts var StringSelectMenuBuilder = class extends BaseSelectMenuBuilder { static { __name(this, "StringSelectMenuBuilder"); @@ -1106,7 +1336,7 @@ var StringSelectMenuBuilder = class extends BaseSelectMenuBuilder { */ constructor(data) { const { options, ...initData } = data ?? {}; - super({ ...initData, type: import_v106.ComponentType.StringSelect }); + super({ ...initData, type: import_v1010.ComponentType.StringSelect }); this.options = options?.map((option) => new StringSelectMenuOptionBuilder(option)) ?? []; } /** @@ -1119,7 +1349,7 @@ var StringSelectMenuBuilder = class extends BaseSelectMenuBuilder { optionsLengthValidator.parse(this.options.length + normalizedOptions.length); this.options.push( ...normalizedOptions.map( - (normalizedOption) => normalizedOption instanceof StringSelectMenuOptionBuilder ? normalizedOption : new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(normalizedOption)) + (normalizedOption) => normalizedOption instanceof StringSelectMenuOptionBuilder ? normalizedOption : new StringSelectMenuOptionBuilder(selectMenuStringOptionPredicate.parse(normalizedOption)) ) ); return this; @@ -1166,7 +1396,7 @@ var StringSelectMenuBuilder = class extends BaseSelectMenuBuilder { index, deleteCount, ...normalizedOptions.map( - (normalizedOption) => normalizedOption instanceof StringSelectMenuOptionBuilder ? normalizedOption : new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(normalizedOption)) + (normalizedOption) => normalizedOption instanceof StringSelectMenuOptionBuilder ? normalizedOption : new StringSelectMenuOptionBuilder(selectMenuStringOptionPredicate.parse(normalizedOption)) ) ); optionsLengthValidator.parse(clone.length); @@ -1186,7 +1416,7 @@ var StringSelectMenuBuilder = class extends BaseSelectMenuBuilder { }; // src/components/selectMenu/UserSelectMenu.ts -var import_v107 = require("discord-api-types/v10"); +var import_v1011 = require("discord-api-types/v10"); var UserSelectMenuBuilder = class extends BaseSelectMenuBuilder { static { __name(this, "UserSelectMenuBuilder"); @@ -1214,7 +1444,7 @@ var UserSelectMenuBuilder = class extends BaseSelectMenuBuilder { * ``` */ constructor(data) { - super({ ...data, type: import_v107.ComponentType.UserSelect }); + super({ ...data, type: import_v1011.ComponentType.UserSelect }); } /** * Adds default users to this auto populated select menu. @@ -1228,7 +1458,7 @@ var UserSelectMenuBuilder = class extends BaseSelectMenuBuilder { this.data.default_values.push( ...normalizedValues.map((id) => ({ id, - type: import_v107.SelectMenuDefaultValueType.User + type: import_v1011.SelectMenuDefaultValueType.User })) ); return this; @@ -1243,7 +1473,7 @@ var UserSelectMenuBuilder = class extends BaseSelectMenuBuilder { optionsLengthValidator.parse(normalizedValues.length); this.data.default_values = normalizedValues.map((id) => ({ id, - type: import_v107.SelectMenuDefaultValueType.User + type: import_v1011.SelectMenuDefaultValueType.User })); return this; } @@ -1251,38 +1481,8 @@ var UserSelectMenuBuilder = class extends BaseSelectMenuBuilder { // src/components/textInput/TextInput.ts var import_util = require("@discordjs/util"); -var import_v109 = require("discord-api-types/v10"); +var import_v1012 = 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 { static { __name(this, "TextInputBuilder"); @@ -1296,7 +1496,7 @@ var TextInputBuilder = class extends ComponentBuilder { * ```ts * const textInput = new TextInputBuilder({ * custom_id: 'a cool text input', - * label: 'Type something', + * placeholder: 'Type something', * style: TextInputStyle.Short, * }); * ``` @@ -1304,14 +1504,14 @@ var TextInputBuilder = class extends ComponentBuilder { * Creating a text input using setters and API data: * ```ts * const textInput = new TextInputBuilder({ - * label: 'Type something else', + * placeholder: 'Type something else', * }) * .setCustomId('woah') * .setStyle(TextInputStyle.Paragraph); * ``` */ constructor(data) { - super({ type: import_v109.ComponentType.TextInput, ...data }); + super({ type: import_v1012.ComponentType.TextInput, ...data }); } /** * Sets the custom id for this text input. @@ -1326,6 +1526,7 @@ var TextInputBuilder = class extends ComponentBuilder { * Sets the label for this text input. * * @param label - The label to use + * @deprecated Use a label builder to create a label (and optionally a description) instead. */ setLabel(label) { this.data.label = labelValidator.parse(label); @@ -1389,7 +1590,7 @@ var TextInputBuilder = class extends ComponentBuilder { * {@inheritDoc ComponentBuilder.toJSON} */ toJSON() { - validateRequiredParameters(this.data.custom_id, this.data.style, this.data.label); + validateRequiredParameters(this.data.custom_id, this.data.style); return { ...this.data }; @@ -1405,12 +1606,177 @@ var TextInputBuilder = class extends ComponentBuilder { } }; +// src/components/label/Assertions.ts +var Assertions_exports6 = {}; +__export(Assertions_exports6, { + labelPredicate: () => labelPredicate +}); +var import_shapeshift6 = require("@sapphire/shapeshift"); +var import_v1013 = require("discord-api-types/v10"); +var labelPredicate = import_shapeshift6.s.object({ + id: idValidator.optional(), + type: import_shapeshift6.s.literal(import_v1013.ComponentType.Label), + label: import_shapeshift6.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45), + description: import_shapeshift6.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).optional(), + component: import_shapeshift6.s.union([ + textInputPredicate, + selectMenuUserPredicate, + selectMenuRolePredicate, + selectMenuMentionablePredicate, + selectMenuChannelPredicate, + selectMenuStringPredicate, + fileUploadPredicate + ]) +}).setValidationEnabled(isValidationEnabled); + +// src/components/label/Label.ts +var LabelBuilder = class extends ComponentBuilder { + static { + __name(this, "LabelBuilder"); + } + /** + * @internal + */ + data; + /** + * Creates a new label. + * + * @param data - The API data to create this label with + * @example + * Creating a label from an API data object: + * ```ts + * const label = new LabelBuilder({ + * label: "label", + * component, + * }); + * ``` + * @example + * Creating a label using setters and API data: + * ```ts + * const label = new LabelBuilder({ + * label: 'label', + * component, + * }).setLabel('new text'); + * ``` + */ + constructor(data = {}) { + super({ type: import_v1014.ComponentType.Label }); + const { component, ...rest } = data; + this.data = { + ...rest, + component: component ? createComponentBuilder(component) : void 0, + type: import_v1014.ComponentType.Label + }; + } + /** + * Sets the label for this label. + * + * @param label - The label to use + */ + setLabel(label) { + this.data.label = label; + return this; + } + /** + * Sets the description for this label. + * + * @param description - The description to use + */ + setDescription(description) { + this.data.description = description; + return this; + } + /** + * Clears the description for this label. + */ + clearDescription() { + this.data.description = void 0; + return this; + } + /** + * Sets a string select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setStringSelectMenuComponent(input) { + this.data.component = resolveBuilder(input, StringSelectMenuBuilder); + return this; + } + /** + * Sets a user select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setUserSelectMenuComponent(input) { + this.data.component = resolveBuilder(input, UserSelectMenuBuilder); + return this; + } + /** + * Sets a role select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setRoleSelectMenuComponent(input) { + this.data.component = resolveBuilder(input, RoleSelectMenuBuilder); + return this; + } + /** + * Sets a mentionable select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setMentionableSelectMenuComponent(input) { + this.data.component = resolveBuilder(input, MentionableSelectMenuBuilder); + return this; + } + /** + * Sets a channel select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setChannelSelectMenuComponent(input) { + this.data.component = resolveBuilder(input, ChannelSelectMenuBuilder); + return this; + } + /** + * Sets a text input component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setTextInputComponent(input) { + this.data.component = resolveBuilder(input, TextInputBuilder); + return this; + } + /** + * Sets a file upload component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setFileUploadComponent(input) { + this.data.component = resolveBuilder(input, FileUploadBuilder); + return this; + } + /** + * {@inheritDoc ComponentBuilder.toJSON} + */ + toJSON() { + const { component, ...rest } = this.data; + const data = { + ...rest, + // The label predicate validates the component. + component: component?.toJSON() + }; + labelPredicate.parse(data); + return data; + } +}; + // src/components/v2/Container.ts -var import_v1015 = require("discord-api-types/v10"); +var import_v1020 = require("discord-api-types/v10"); // src/components/v2/Assertions.ts -var Assertions_exports4 = {}; -__export(Assertions_exports4, { +var Assertions_exports7 = {}; +__export(Assertions_exports7, { accessoryPredicate: () => accessoryPredicate, assertReturnOfBuilder: () => assertReturnOfBuilder, containerColorPredicate: () => containerColorPredicate, @@ -1423,11 +1789,11 @@ __export(Assertions_exports4, { unfurledMediaItemPredicate: () => unfurledMediaItemPredicate, validateComponentArray: () => validateComponentArray }); -var import_shapeshift4 = require("@sapphire/shapeshift"); -var import_v1011 = require("discord-api-types/v10"); +var import_shapeshift7 = require("@sapphire/shapeshift"); +var import_v1016 = require("discord-api-types/v10"); // src/components/v2/Thumbnail.ts -var import_v1010 = require("discord-api-types/v10"); +var import_v1015 = require("discord-api-types/v10"); var ThumbnailBuilder = class extends ComponentBuilder { static { __name(this, "ThumbnailBuilder"); @@ -1459,7 +1825,7 @@ var ThumbnailBuilder = class extends ComponentBuilder { */ constructor(data = {}) { super({ - type: import_v1010.ComponentType.Thumbnail, + type: import_v1015.ComponentType.Thumbnail, ...data, media: data.media ? { url: data.media.url } : void 0 }); @@ -1508,33 +1874,33 @@ var ThumbnailBuilder = class extends ComponentBuilder { }; // src/components/v2/Assertions.ts -var unfurledMediaItemPredicate = import_shapeshift4.s.object({ - url: import_shapeshift4.s.string().url( +var unfurledMediaItemPredicate = import_shapeshift7.s.object({ + url: import_shapeshift7.s.string().url( { allowedProtocols: ["http:", "https:", "attachment:"] }, { message: "Invalid protocol for media URL. Must be http:, https:, or attachment:" } ) }).setValidationEnabled(isValidationEnabled); -var descriptionPredicate2 = import_shapeshift4.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(1024).setValidationEnabled(isValidationEnabled); -var filePredicate = import_shapeshift4.s.object({ - url: import_shapeshift4.s.string().url({ allowedProtocols: ["attachment:"] }, { message: "Invalid protocol for file URL. Must be attachment:" }) +var descriptionPredicate2 = import_shapeshift7.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(1024).setValidationEnabled(isValidationEnabled); +var filePredicate = import_shapeshift7.s.object({ + url: import_shapeshift7.s.string().url({ allowedProtocols: ["attachment:"] }, { message: "Invalid protocol for file URL. Must be attachment:" }) }).setValidationEnabled(isValidationEnabled); -var spoilerPredicate = import_shapeshift4.s.boolean(); -var dividerPredicate = import_shapeshift4.s.boolean(); -var spacingPredicate = import_shapeshift4.s.nativeEnum(import_v1011.SeparatorSpacingSize); -var textDisplayContentPredicate = import_shapeshift4.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled); -var accessoryPredicate = import_shapeshift4.s.instance(ButtonBuilder).or(import_shapeshift4.s.instance(ThumbnailBuilder)).setValidationEnabled(isValidationEnabled); +var spoilerPredicate = import_shapeshift7.s.boolean(); +var dividerPredicate = import_shapeshift7.s.boolean(); +var spacingPredicate = import_shapeshift7.s.nativeEnum(import_v1016.SeparatorSpacingSize); +var textDisplayContentPredicate = import_shapeshift7.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled); +var accessoryPredicate = import_shapeshift7.s.instance(ButtonBuilder).or(import_shapeshift7.s.instance(ThumbnailBuilder)).setValidationEnabled(isValidationEnabled); var containerColorPredicate = colorPredicate.nullish(); function assertReturnOfBuilder(input, ExpectedInstanceOf) { - import_shapeshift4.s.instance(ExpectedInstanceOf).setValidationEnabled(isValidationEnabled).parse(input); + import_shapeshift7.s.instance(ExpectedInstanceOf).setValidationEnabled(isValidationEnabled).parse(input); } __name(assertReturnOfBuilder, "assertReturnOfBuilder"); function validateComponentArray(input, min, max, ExpectedInstanceOf) { - (ExpectedInstanceOf ? import_shapeshift4.s.instance(ExpectedInstanceOf) : import_shapeshift4.s.instance(ComponentBuilder)).array().lengthGreaterThanOrEqual(min).lengthLessThanOrEqual(max).setValidationEnabled(isValidationEnabled).parse(input); + (ExpectedInstanceOf ? import_shapeshift7.s.instance(ExpectedInstanceOf) : import_shapeshift7.s.instance(ComponentBuilder)).array().lengthGreaterThanOrEqual(min).lengthLessThanOrEqual(max).setValidationEnabled(isValidationEnabled).parse(input); } __name(validateComponentArray, "validateComponentArray"); // src/components/v2/File.ts -var import_v1012 = require("discord-api-types/v10"); +var import_v1017 = require("discord-api-types/v10"); var FileBuilder = class extends ComponentBuilder { static { __name(this, "FileBuilder"); @@ -1565,7 +1931,7 @@ var FileBuilder = class extends ComponentBuilder { * ``` */ constructor(data = {}) { - super({ type: import_v1012.ComponentType.File, ...data, file: data.file ? { url: data.file.url } : void 0 }); + super({ type: import_v1017.ComponentType.File, ...data, file: data.file ? { url: data.file.url } : void 0 }); } /** * Sets the spoiler status of this file. @@ -1595,7 +1961,7 @@ var FileBuilder = class extends ComponentBuilder { }; // src/components/v2/Separator.ts -var import_v1013 = require("discord-api-types/v10"); +var import_v1018 = require("discord-api-types/v10"); var SeparatorBuilder = class extends ComponentBuilder { static { __name(this, "SeparatorBuilder"); @@ -1623,7 +1989,7 @@ var SeparatorBuilder = class extends ComponentBuilder { */ constructor(data = {}) { super({ - type: import_v1013.ComponentType.Separator, + type: import_v1018.ComponentType.Separator, ...data }); } @@ -1661,7 +2027,7 @@ var SeparatorBuilder = class extends ComponentBuilder { }; // src/components/v2/TextDisplay.ts -var import_v1014 = require("discord-api-types/v10"); +var import_v1019 = require("discord-api-types/v10"); var TextDisplayBuilder = class extends ComponentBuilder { static { __name(this, "TextDisplayBuilder"); @@ -1688,7 +2054,7 @@ var TextDisplayBuilder = class extends ComponentBuilder { */ constructor(data = {}) { super({ - type: import_v1014.ComponentType.TextDisplay, + type: import_v1019.ComponentType.TextDisplay, ...data }); } @@ -1746,11 +2112,12 @@ var ContainerBuilder = class extends ComponentBuilder { * }, * ], * }) - * .addComponents(separator, section); + * .addSeparatorComponents(separator) + * .addSectionComponents(section); * ``` */ constructor({ components, ...data } = {}) { - super({ type: import_v1015.ComponentType.Container, ...data }); + super({ type: import_v1020.ComponentType.Container, ...data }); this.components = components?.map((component) => createComponentBuilder(component)) ?? []; } /** @@ -1873,7 +2240,7 @@ var ContainerBuilder = class extends ComponentBuilder { }; // src/components/v2/MediaGallery.ts -var import_v1016 = require("discord-api-types/v10"); +var import_v1021 = require("discord-api-types/v10"); // src/components/v2/MediaGalleryItem.ts var MediaGalleryItemBuilder = class { @@ -2003,7 +2370,7 @@ var MediaGalleryBuilder = class extends ComponentBuilder { * ``` */ constructor({ items, ...data } = {}) { - super({ type: import_v1016.ComponentType.MediaGallery, ...data }); + super({ type: import_v1021.ComponentType.MediaGallery, ...data }); this.items = items?.map((item) => new MediaGalleryItemBuilder(item)) ?? []; } /** @@ -2053,7 +2420,7 @@ var MediaGalleryBuilder = class extends ComponentBuilder { }; // src/components/v2/Section.ts -var import_v1017 = require("discord-api-types/v10"); +var import_v1022 = require("discord-api-types/v10"); var SectionBuilder = class extends ComponentBuilder { static { __name(this, "SectionBuilder"); @@ -2102,7 +2469,7 @@ var SectionBuilder = class extends ComponentBuilder { * ``` */ constructor({ components, accessory, ...data } = {}) { - super({ type: import_v1017.ComponentType.Section, ...data }); + super({ type: import_v1022.ComponentType.Section, ...data }); this.components = components?.map((component) => createComponentBuilder(component)) ?? []; this.accessory = accessory ? createComponentBuilder(accessory) : void 0; } @@ -2177,36 +2544,40 @@ function createComponentBuilder(data) { return data; } switch (data.type) { - case import_v1018.ComponentType.ActionRow: + case import_v1023.ComponentType.ActionRow: return new ActionRowBuilder(data); - case import_v1018.ComponentType.Button: + case import_v1023.ComponentType.Button: return new ButtonBuilder(data); - case import_v1018.ComponentType.StringSelect: + case import_v1023.ComponentType.StringSelect: return new StringSelectMenuBuilder(data); - case import_v1018.ComponentType.TextInput: + case import_v1023.ComponentType.TextInput: return new TextInputBuilder(data); - case import_v1018.ComponentType.UserSelect: + case import_v1023.ComponentType.UserSelect: return new UserSelectMenuBuilder(data); - case import_v1018.ComponentType.RoleSelect: + case import_v1023.ComponentType.RoleSelect: return new RoleSelectMenuBuilder(data); - case import_v1018.ComponentType.MentionableSelect: + case import_v1023.ComponentType.MentionableSelect: return new MentionableSelectMenuBuilder(data); - case import_v1018.ComponentType.ChannelSelect: + case import_v1023.ComponentType.ChannelSelect: return new ChannelSelectMenuBuilder(data); - case import_v1018.ComponentType.File: + case import_v1023.ComponentType.File: return new FileBuilder(data); - case import_v1018.ComponentType.Container: + case import_v1023.ComponentType.Container: return new ContainerBuilder(data); - case import_v1018.ComponentType.Section: + case import_v1023.ComponentType.Section: return new SectionBuilder(data); - case import_v1018.ComponentType.Separator: + case import_v1023.ComponentType.Separator: return new SeparatorBuilder(data); - case import_v1018.ComponentType.TextDisplay: + case import_v1023.ComponentType.TextDisplay: return new TextDisplayBuilder(data); - case import_v1018.ComponentType.Thumbnail: + case import_v1023.ComponentType.Thumbnail: return new ThumbnailBuilder(data); - case import_v1018.ComponentType.MediaGallery: + case import_v1023.ComponentType.MediaGallery: return new MediaGalleryBuilder(data); + case import_v1023.ComponentType.Label: + return new LabelBuilder(data); + case import_v1023.ComponentType.FileUpload: + return new FileUploadBuilder(data); default: throw new Error(`Cannot properly serialize component type: ${data.type}`); } @@ -2271,7 +2642,7 @@ var ActionRowBuilder = class extends ComponentBuilder { * ``` */ constructor({ components, ...data } = {}) { - super({ type: import_v1019.ComponentType.ActionRow, ...data }); + super({ type: import_v1024.ComponentType.ActionRow, ...data }); this.components = components?.map((component) => createComponentBuilder(component)) ?? []; } /** @@ -2303,16 +2674,19 @@ var ActionRowBuilder = class extends ComponentBuilder { } }; +// src/interactions/modals/Modal.ts +var import_v1025 = require("discord-api-types/v10"); + // src/interactions/modals/Assertions.ts -var Assertions_exports5 = {}; -__export(Assertions_exports5, { +var Assertions_exports8 = {}; +__export(Assertions_exports8, { componentsValidator: () => componentsValidator, titleValidator: () => titleValidator, validateRequiredParameters: () => validateRequiredParameters2 }); -var import_shapeshift5 = require("@sapphire/shapeshift"); -var titleValidator = import_shapeshift5.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45).setValidationEnabled(isValidationEnabled); -var componentsValidator = import_shapeshift5.s.instance(ActionRowBuilder).array().lengthGreaterThanOrEqual(1).setValidationEnabled(isValidationEnabled); +var import_shapeshift8 = require("@sapphire/shapeshift"); +var titleValidator = import_shapeshift8.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45).setValidationEnabled(isValidationEnabled); +var componentsValidator = import_shapeshift8.s.union([import_shapeshift8.s.instance(ActionRowBuilder), import_shapeshift8.s.instance(LabelBuilder), import_shapeshift8.s.instance(TextDisplayBuilder)]).array().lengthGreaterThanOrEqual(1).setValidationEnabled(isValidationEnabled); function validateRequiredParameters2(customId, title, components) { customIdValidator.parse(customId); titleValidator.parse(title); @@ -2364,19 +2738,121 @@ var ModalBuilder = class { * Adds components to this modal. * * @param components - The components to add + * @deprecated Use {@link ModalBuilder.addLabelComponents} or {@link ModalBuilder.addTextDisplayComponents} instead */ addComponents(...components) { this.components.push( - ...normalizeArray(components).map( - (component) => component instanceof ActionRowBuilder ? component : new ActionRowBuilder(component) - ) + ...normalizeArray(components).map((component, idx) => { + if (component instanceof ActionRowBuilder || component instanceof LabelBuilder || component instanceof TextDisplayBuilder) { + return component; + } + if (component instanceof TextInputBuilder) { + return new ActionRowBuilder().addComponents(component); + } + if ("type" in component) { + if (component.type === import_v1025.ComponentType.ActionRow) { + return new ActionRowBuilder(component); + } + if (component.type === import_v1025.ComponentType.Label) { + return new LabelBuilder(component); + } + if (component.type === import_v1025.ComponentType.TextDisplay) { + return new TextDisplayBuilder(component); + } + if (component.type === import_v1025.ComponentType.TextInput) { + return new ActionRowBuilder().addComponents( + new TextInputBuilder(component) + ); + } + } + throw new TypeError(`Invalid component passed in ModalBuilder.addComponents at index ${idx}!`); + }) ); return this; } + /** + * Adds label components to this modal. + * + * @param components - The components to add + */ + addLabelComponents(...components) { + const normalized = normalizeArray(components); + const resolved = normalized.map((label) => resolveBuilder(label, LabelBuilder)); + this.components.push(...resolved); + return this; + } + /** + * Adds text display components to this modal. + * + * @param components - The components to add + */ + addTextDisplayComponents(...components) { + const normalized = normalizeArray(components); + const resolved = normalized.map((row) => resolveBuilder(row, TextDisplayBuilder)); + this.components.push(...resolved); + return this; + } + /** + * Adds action rows to this modal. + * + * @param components - The components to add + * @deprecated Use {@link ModalBuilder.addLabelComponents} instead + */ + addActionRowComponents(...components) { + const normalized = normalizeArray(components); + const resolved = normalized.map((row) => resolveBuilder(row, ActionRowBuilder)); + this.components.push(...resolved); + return this; + } + /** + * Sets the labels for this modal. + * + * @param components - The components to set + */ + setLabelComponents(...components) { + const normalized = normalizeArray(components); + this.spliceLabelComponents(0, this.components.length, ...normalized); + return this; + } + /** + * Removes, replaces, or inserts labels for this modal. + * + * @remarks + * This method behaves similarly + * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}. + * The maximum amount of labels that can be added is 5. + * + * It's useful for modifying and adjusting order of the already-existing labels of a modal. + * @example + * Remove the first label: + * ```ts + * modal.spliceLabelComponents(0, 1); + * ``` + * @example + * Remove the first n labels: + * ```ts + * const n = 4; + * modal.spliceLabelComponents(0, n); + * ``` + * @example + * Remove the last label: + * ```ts + * modal.spliceLabelComponents(-1, 1); + * ``` + * @param index - The index to start at + * @param deleteCount - The number of labels to remove + * @param labels - The replacing label objects + */ + spliceLabelComponents(index, deleteCount, ...labels) { + const resolved = labels.map((label) => resolveBuilder(label, LabelBuilder)); + this.components.splice(index, deleteCount, ...resolved); + return this; + } /** * Sets components for this modal. * * @param components - The components to set + * @deprecated Use {@link ModalBuilder.setLabelComponents} instead */ setComponents(...components) { this.components.splice(0, this.components.length, ...normalizeArray(components)); @@ -2395,8 +2871,8 @@ var ModalBuilder = class { }; // src/interactions/slashCommands/Assertions.ts -var Assertions_exports6 = {}; -__export(Assertions_exports6, { +var Assertions_exports9 = {}; +__export(Assertions_exports9, { assertReturnOfBuilder: () => assertReturnOfBuilder2, contextsPredicate: () => contextsPredicate, integrationTypesPredicate: () => integrationTypesPredicate, @@ -2414,20 +2890,20 @@ __export(Assertions_exports6, { validateRequired: () => validateRequired, validateRequiredParameters: () => validateRequiredParameters3 }); -var import_shapeshift6 = require("@sapphire/shapeshift"); -var import_v1020 = require("discord-api-types/v10"); -var namePredicate = import_shapeshift6.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(32).regex(/^[\p{Ll}\p{Lm}\p{Lo}\p{N}\p{sc=Devanagari}\p{sc=Thai}_-]+$/u).setValidationEnabled(isValidationEnabled); +var import_shapeshift9 = require("@sapphire/shapeshift"); +var import_v1026 = require("discord-api-types/v10"); +var namePredicate = import_shapeshift9.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 descriptionPredicate3 = import_shapeshift6.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled); -var localePredicate = import_shapeshift6.s.nativeEnum(import_v1020.Locale); +var descriptionPredicate3 = import_shapeshift9.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled); +var localePredicate = import_shapeshift9.s.nativeEnum(import_v1026.Locale); function validateDescription(description) { descriptionPredicate3.parse(description); } __name(validateDescription, "validateDescription"); -var maxArrayLengthPredicate = import_shapeshift6.s.unknown().array().lengthLessThanOrEqual(25).setValidationEnabled(isValidationEnabled); +var maxArrayLengthPredicate = import_shapeshift9.s.unknown().array().lengthLessThanOrEqual(25).setValidationEnabled(isValidationEnabled); function validateLocale(locale) { return localePredicate.parse(locale); } @@ -2442,7 +2918,7 @@ function validateRequiredParameters3(name, description, options) { validateMaxOptionsLength(options); } __name(validateRequiredParameters3, "validateRequiredParameters"); -var booleanPredicate = import_shapeshift6.s.boolean(); +var booleanPredicate = import_shapeshift9.s.boolean(); function validateDefaultPermission(value) { booleanPredicate.parse(value); } @@ -2451,29 +2927,29 @@ function validateRequired(required) { booleanPredicate.parse(required); } __name(validateRequired, "validateRequired"); -var choicesLengthPredicate = import_shapeshift6.s.number().lessThanOrEqual(25).setValidationEnabled(isValidationEnabled); +var choicesLengthPredicate = import_shapeshift9.s.number().lessThanOrEqual(25).setValidationEnabled(isValidationEnabled); function validateChoicesLength(amountAdding, choices) { choicesLengthPredicate.parse((choices?.length ?? 0) + amountAdding); } __name(validateChoicesLength, "validateChoicesLength"); function assertReturnOfBuilder2(input, ExpectedInstanceOf) { - import_shapeshift6.s.instance(ExpectedInstanceOf).parse(input); + import_shapeshift9.s.instance(ExpectedInstanceOf).parse(input); } __name(assertReturnOfBuilder2, "assertReturnOfBuilder"); -var localizationMapPredicate = import_shapeshift6.s.object(Object.fromEntries(Object.values(import_v1020.Locale).map((locale) => [locale, import_shapeshift6.s.string().nullish()]))).strict().nullish().setValidationEnabled(isValidationEnabled); +var localizationMapPredicate = import_shapeshift9.s.object(Object.fromEntries(Object.values(import_v1026.Locale).map((locale) => [locale, import_shapeshift9.s.string().nullish()]))).strict().nullish().setValidationEnabled(isValidationEnabled); function validateLocalizationMap(value) { localizationMapPredicate.parse(value); } __name(validateLocalizationMap, "validateLocalizationMap"); -var dmPermissionPredicate = import_shapeshift6.s.boolean().nullish(); +var dmPermissionPredicate = import_shapeshift9.s.boolean().nullish(); function validateDMPermission(value) { dmPermissionPredicate.parse(value); } __name(validateDMPermission, "validateDMPermission"); -var memberPermissionPredicate = import_shapeshift6.s.union([ - import_shapeshift6.s.bigint().transform((value) => value.toString()), - import_shapeshift6.s.number().safeInt().transform((value) => value.toString()), - import_shapeshift6.s.string().regex(/^\d+$/) +var memberPermissionPredicate = import_shapeshift9.s.union([ + import_shapeshift9.s.bigint().transform((value) => value.toString()), + import_shapeshift9.s.number().safeInt().transform((value) => value.toString()), + import_shapeshift9.s.string().regex(/^\d+$/) ]).nullish(); function validateDefaultMemberPermissions(permissions) { return memberPermissionPredicate.parse(permissions); @@ -2483,11 +2959,11 @@ function validateNSFW(value) { booleanPredicate.parse(value); } __name(validateNSFW, "validateNSFW"); -var contextsPredicate = import_shapeshift6.s.array( - import_shapeshift6.s.nativeEnum(import_v1020.InteractionContextType).setValidationEnabled(isValidationEnabled) +var contextsPredicate = import_shapeshift9.s.array( + import_shapeshift9.s.nativeEnum(import_v1026.InteractionContextType).setValidationEnabled(isValidationEnabled) ); -var integrationTypesPredicate = import_shapeshift6.s.array( - import_shapeshift6.s.nativeEnum(import_v1020.ApplicationIntegrationType).setValidationEnabled(isValidationEnabled) +var integrationTypesPredicate = import_shapeshift9.s.array( + import_shapeshift9.s.nativeEnum(import_v1026.ApplicationIntegrationType).setValidationEnabled(isValidationEnabled) ); // src/interactions/slashCommands/SlashCommandBuilder.ts @@ -2607,7 +3083,7 @@ var SharedNameAndDescription = class { }; // src/interactions/slashCommands/mixins/SharedSlashCommand.ts -var import_v1021 = require("discord-api-types/v10"); +var import_v1027 = require("discord-api-types/v10"); var SharedSlashCommand = class { static { __name(this, "SharedSlashCommand"); @@ -2712,14 +3188,14 @@ var SharedSlashCommand = class { validateLocalizationMap(this.description_localizations); return { ...this, - type: import_v1021.ApplicationCommandType.ChatInput, + type: import_v1027.ApplicationCommandType.ChatInput, options: this.options.map((option) => option.toJSON()) }; } }; // src/interactions/slashCommands/options/attachment.ts -var import_v1022 = require("discord-api-types/v10"); +var import_v1028 = require("discord-api-types/v10"); // src/interactions/slashCommands/mixins/ApplicationCommandOptionBase.ts var ApplicationCommandOptionBase = class extends SharedNameAndDescription { @@ -2761,7 +3237,7 @@ var SlashCommandAttachmentOption = class extends ApplicationCommandOptionBase { /** * The type of this option. */ - type = import_v1022.ApplicationCommandOptionType.Attachment; + type = import_v1028.ApplicationCommandOptionType.Attachment; /** * {@inheritDoc ApplicationCommandOptionBase.toJSON} */ @@ -2772,7 +3248,7 @@ var SlashCommandAttachmentOption = class extends ApplicationCommandOptionBase { }; // src/interactions/slashCommands/options/boolean.ts -var import_v1023 = require("discord-api-types/v10"); +var import_v1029 = require("discord-api-types/v10"); var SlashCommandBooleanOption = class extends ApplicationCommandOptionBase { static { __name(this, "SlashCommandBooleanOption"); @@ -2780,7 +3256,7 @@ var SlashCommandBooleanOption = class extends ApplicationCommandOptionBase { /** * The type of this option. */ - type = import_v1023.ApplicationCommandOptionType.Boolean; + type = import_v1029.ApplicationCommandOptionType.Boolean; /** * {@inheritDoc ApplicationCommandOptionBase.toJSON} */ @@ -2791,25 +3267,25 @@ var SlashCommandBooleanOption = class extends ApplicationCommandOptionBase { }; // src/interactions/slashCommands/options/channel.ts -var import_v1025 = require("discord-api-types/v10"); +var import_v1031 = require("discord-api-types/v10"); var import_ts_mixer = require("ts-mixer"); // src/interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.ts -var import_shapeshift7 = require("@sapphire/shapeshift"); -var import_v1024 = require("discord-api-types/v10"); +var import_shapeshift10 = require("@sapphire/shapeshift"); +var import_v1030 = require("discord-api-types/v10"); var allowedChannelTypes = [ - import_v1024.ChannelType.GuildText, - import_v1024.ChannelType.GuildVoice, - import_v1024.ChannelType.GuildCategory, - import_v1024.ChannelType.GuildAnnouncement, - import_v1024.ChannelType.AnnouncementThread, - import_v1024.ChannelType.PublicThread, - import_v1024.ChannelType.PrivateThread, - import_v1024.ChannelType.GuildStageVoice, - import_v1024.ChannelType.GuildForum, - import_v1024.ChannelType.GuildMedia + import_v1030.ChannelType.GuildText, + import_v1030.ChannelType.GuildVoice, + import_v1030.ChannelType.GuildCategory, + import_v1030.ChannelType.GuildAnnouncement, + import_v1030.ChannelType.AnnouncementThread, + import_v1030.ChannelType.PublicThread, + import_v1030.ChannelType.PrivateThread, + import_v1030.ChannelType.GuildStageVoice, + import_v1030.ChannelType.GuildForum, + import_v1030.ChannelType.GuildMedia ]; -var channelTypesPredicate = import_shapeshift7.s.array(import_shapeshift7.s.union(allowedChannelTypes.map((type) => import_shapeshift7.s.literal(type)))); +var channelTypesPredicate = import_shapeshift10.s.array(import_shapeshift10.s.union(allowedChannelTypes.map((type) => import_shapeshift10.s.literal(type)))); var ApplicationCommandOptionChannelTypesMixin = class { static { __name(this, "ApplicationCommandOptionChannelTypesMixin"); @@ -2837,7 +3313,7 @@ var SlashCommandChannelOption = class extends ApplicationCommandOptionBase { /** * The type of this option. */ - type = import_v1025.ApplicationCommandOptionType.Channel; + type = import_v1031.ApplicationCommandOptionType.Channel; /** * {@inheritDoc ApplicationCommandOptionBase.toJSON} */ @@ -2852,8 +3328,8 @@ SlashCommandChannelOption = __decorateClass([ ], SlashCommandChannelOption); // src/interactions/slashCommands/options/integer.ts -var import_shapeshift10 = require("@sapphire/shapeshift"); -var import_v1027 = require("discord-api-types/v10"); +var import_shapeshift13 = require("@sapphire/shapeshift"); +var import_v1033 = require("discord-api-types/v10"); var import_ts_mixer2 = require("ts-mixer"); // src/interactions/slashCommands/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.ts @@ -2872,8 +3348,8 @@ var ApplicationCommandNumericOptionMinMaxValueMixin = class { }; // src/interactions/slashCommands/mixins/ApplicationCommandOptionWithAutocompleteMixin.ts -var import_shapeshift8 = require("@sapphire/shapeshift"); -var booleanPredicate2 = import_shapeshift8.s.boolean(); +var import_shapeshift11 = require("@sapphire/shapeshift"); +var booleanPredicate2 = import_shapeshift11.s.boolean(); var ApplicationCommandOptionWithAutocompleteMixin = class { static { __name(this, "ApplicationCommandOptionWithAutocompleteMixin"); @@ -2904,14 +3380,14 @@ var ApplicationCommandOptionWithAutocompleteMixin = class { }; // src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesMixin.ts -var import_shapeshift9 = require("@sapphire/shapeshift"); -var import_v1026 = require("discord-api-types/v10"); -var stringPredicate = import_shapeshift9.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100); -var numberPredicate = import_shapeshift9.s.number().greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY); -var choicesPredicate = import_shapeshift9.s.object({ +var import_shapeshift12 = require("@sapphire/shapeshift"); +var import_v1032 = require("discord-api-types/v10"); +var stringPredicate = import_shapeshift12.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100); +var numberPredicate = import_shapeshift12.s.number().greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY); +var choicesPredicate = import_shapeshift12.s.object({ name: stringPredicate, name_localizations: localizationMapPredicate, - value: import_shapeshift9.s.union([stringPredicate, numberPredicate]) + value: import_shapeshift12.s.union([stringPredicate, numberPredicate]) }).array(); var ApplicationCommandOptionWithChoicesMixin = class { static { @@ -2943,7 +3419,7 @@ var ApplicationCommandOptionWithChoicesMixin = class { } validateChoicesLength(normalizedChoices.length, this.choices); for (const { name, name_localizations, value } of normalizedChoices) { - if (this.type === import_v1026.ApplicationCommandOptionType.String) { + if (this.type === import_v1032.ApplicationCommandOptionType.String) { stringPredicate.parse(value); } else { numberPredicate.parse(value); @@ -2970,12 +3446,12 @@ var ApplicationCommandOptionWithChoicesMixin = class { }; // src/interactions/slashCommands/options/integer.ts -var numberValidator = import_shapeshift10.s.number().int(); +var numberValidator = import_shapeshift13.s.number().int(); var SlashCommandIntegerOption = class extends ApplicationCommandOptionBase { /** * The type of this option. */ - type = import_v1027.ApplicationCommandOptionType.Integer; + type = import_v1033.ApplicationCommandOptionType.Integer; /** * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue} */ @@ -3013,7 +3489,7 @@ SlashCommandIntegerOption = __decorateClass([ ], SlashCommandIntegerOption); // src/interactions/slashCommands/options/mentionable.ts -var import_v1028 = require("discord-api-types/v10"); +var import_v1034 = require("discord-api-types/v10"); var SlashCommandMentionableOption = class extends ApplicationCommandOptionBase { static { __name(this, "SlashCommandMentionableOption"); @@ -3021,7 +3497,7 @@ var SlashCommandMentionableOption = class extends ApplicationCommandOptionBase { /** * The type of this option. */ - type = import_v1028.ApplicationCommandOptionType.Mentionable; + type = import_v1034.ApplicationCommandOptionType.Mentionable; /** * {@inheritDoc ApplicationCommandOptionBase.toJSON} */ @@ -3032,15 +3508,15 @@ var SlashCommandMentionableOption = class extends ApplicationCommandOptionBase { }; // src/interactions/slashCommands/options/number.ts -var import_shapeshift11 = require("@sapphire/shapeshift"); -var import_v1029 = require("discord-api-types/v10"); +var import_shapeshift14 = require("@sapphire/shapeshift"); +var import_v1035 = require("discord-api-types/v10"); var import_ts_mixer3 = require("ts-mixer"); -var numberValidator2 = import_shapeshift11.s.number(); +var numberValidator2 = import_shapeshift14.s.number(); var SlashCommandNumberOption = class extends ApplicationCommandOptionBase { /** * The type of this option. */ - type = import_v1029.ApplicationCommandOptionType.Number; + type = import_v1035.ApplicationCommandOptionType.Number; /** * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue} */ @@ -3078,7 +3554,7 @@ SlashCommandNumberOption = __decorateClass([ ], SlashCommandNumberOption); // src/interactions/slashCommands/options/role.ts -var import_v1030 = require("discord-api-types/v10"); +var import_v1036 = require("discord-api-types/v10"); var SlashCommandRoleOption = class extends ApplicationCommandOptionBase { static { __name(this, "SlashCommandRoleOption"); @@ -3086,7 +3562,7 @@ var SlashCommandRoleOption = class extends ApplicationCommandOptionBase { /** * The type of this option. */ - type = import_v1030.ApplicationCommandOptionType.Role; + type = import_v1036.ApplicationCommandOptionType.Role; /** * {@inheritDoc ApplicationCommandOptionBase.toJSON} */ @@ -3097,16 +3573,16 @@ var SlashCommandRoleOption = class extends ApplicationCommandOptionBase { }; // src/interactions/slashCommands/options/string.ts -var import_shapeshift12 = require("@sapphire/shapeshift"); -var import_v1031 = require("discord-api-types/v10"); +var import_shapeshift15 = require("@sapphire/shapeshift"); +var import_v1037 = require("discord-api-types/v10"); var import_ts_mixer4 = require("ts-mixer"); -var minLengthValidator2 = import_shapeshift12.s.number().greaterThanOrEqual(0).lessThanOrEqual(6e3); -var maxLengthValidator2 = import_shapeshift12.s.number().greaterThanOrEqual(1).lessThanOrEqual(6e3); +var minLengthValidator2 = import_shapeshift15.s.number().greaterThanOrEqual(0).lessThanOrEqual(6e3); +var maxLengthValidator2 = import_shapeshift15.s.number().greaterThanOrEqual(1).lessThanOrEqual(6e3); var SlashCommandStringOption = class extends ApplicationCommandOptionBase { /** * The type of this option. */ - type = import_v1031.ApplicationCommandOptionType.String; + type = import_v1037.ApplicationCommandOptionType.String; /** * The maximum length of this option. */ @@ -3152,7 +3628,7 @@ SlashCommandStringOption = __decorateClass([ ], SlashCommandStringOption); // src/interactions/slashCommands/options/user.ts -var import_v1032 = require("discord-api-types/v10"); +var import_v1038 = require("discord-api-types/v10"); var SlashCommandUserOption = class extends ApplicationCommandOptionBase { static { __name(this, "SlashCommandUserOption"); @@ -3160,7 +3636,7 @@ var SlashCommandUserOption = class extends ApplicationCommandOptionBase { /** * The type of this option. */ - type = import_v1032.ApplicationCommandOptionType.User; + type = import_v1038.ApplicationCommandOptionType.User; /** * {@inheritDoc ApplicationCommandOptionBase.toJSON} */ @@ -3266,7 +3742,7 @@ var SharedSlashCommandOptions = class { }; // src/interactions/slashCommands/SlashCommandSubcommands.ts -var import_v1033 = require("discord-api-types/v10"); +var import_v1039 = require("discord-api-types/v10"); var import_ts_mixer5 = require("ts-mixer"); var SlashCommandSubcommandGroupBuilder = class { /** @@ -3304,7 +3780,7 @@ var SlashCommandSubcommandGroupBuilder = class { toJSON() { validateRequiredParameters3(this.name, this.description, this.options); return { - type: import_v1033.ApplicationCommandOptionType.SubcommandGroup, + type: import_v1039.ApplicationCommandOptionType.SubcommandGroup, name: this.name, name_localizations: this.name_localizations, description: this.description, @@ -3340,7 +3816,7 @@ var SlashCommandSubcommandBuilder = class { toJSON() { validateRequiredParameters3(this.name, this.description, this.options); return { - type: import_v1033.ApplicationCommandOptionType.Subcommand, + type: import_v1039.ApplicationCommandOptionType.Subcommand, name: this.name, name_localizations: this.name_localizations, description: this.description, @@ -3448,8 +3924,8 @@ SlashCommandBuilder = __decorateClass([ ], SlashCommandBuilder); // src/interactions/contextMenuCommands/Assertions.ts -var Assertions_exports7 = {}; -__export(Assertions_exports7, { +var Assertions_exports10 = {}; +__export(Assertions_exports10, { contextsPredicate: () => contextsPredicate2, integrationTypesPredicate: () => integrationTypesPredicate2, validateDMPermission: () => validateDMPermission2, @@ -3459,11 +3935,11 @@ __export(Assertions_exports7, { validateRequiredParameters: () => validateRequiredParameters4, validateType: () => validateType }); -var import_shapeshift13 = require("@sapphire/shapeshift"); -var import_v1034 = require("discord-api-types/v10"); -var namePredicate2 = import_shapeshift13.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(32).regex(/\S/).setValidationEnabled(isValidationEnabled); -var typePredicate = import_shapeshift13.s.union([import_shapeshift13.s.literal(import_v1034.ApplicationCommandType.User), import_shapeshift13.s.literal(import_v1034.ApplicationCommandType.Message)]).setValidationEnabled(isValidationEnabled); -var booleanPredicate3 = import_shapeshift13.s.boolean(); +var import_shapeshift16 = require("@sapphire/shapeshift"); +var import_v1040 = require("discord-api-types/v10"); +var namePredicate2 = import_shapeshift16.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(32).regex(/\S/).setValidationEnabled(isValidationEnabled); +var typePredicate = import_shapeshift16.s.union([import_shapeshift16.s.literal(import_v1040.ApplicationCommandType.User), import_shapeshift16.s.literal(import_v1040.ApplicationCommandType.Message)]).setValidationEnabled(isValidationEnabled); +var booleanPredicate3 = import_shapeshift16.s.boolean(); function validateDefaultPermission2(value) { booleanPredicate3.parse(value); } @@ -3481,25 +3957,25 @@ function validateRequiredParameters4(name, type) { validateType(type); } __name(validateRequiredParameters4, "validateRequiredParameters"); -var dmPermissionPredicate2 = import_shapeshift13.s.boolean().nullish(); +var dmPermissionPredicate2 = import_shapeshift16.s.boolean().nullish(); function validateDMPermission2(value) { dmPermissionPredicate2.parse(value); } __name(validateDMPermission2, "validateDMPermission"); -var memberPermissionPredicate2 = import_shapeshift13.s.union([ - import_shapeshift13.s.bigint().transform((value) => value.toString()), - import_shapeshift13.s.number().safeInt().transform((value) => value.toString()), - import_shapeshift13.s.string().regex(/^\d+$/) +var memberPermissionPredicate2 = import_shapeshift16.s.union([ + import_shapeshift16.s.bigint().transform((value) => value.toString()), + import_shapeshift16.s.number().safeInt().transform((value) => value.toString()), + import_shapeshift16.s.string().regex(/^\d+$/) ]).nullish(); function validateDefaultMemberPermissions2(permissions) { return memberPermissionPredicate2.parse(permissions); } __name(validateDefaultMemberPermissions2, "validateDefaultMemberPermissions"); -var contextsPredicate2 = import_shapeshift13.s.array( - import_shapeshift13.s.nativeEnum(import_v1034.InteractionContextType).setValidationEnabled(isValidationEnabled) +var contextsPredicate2 = import_shapeshift16.s.array( + import_shapeshift16.s.nativeEnum(import_v1040.InteractionContextType).setValidationEnabled(isValidationEnabled) ); -var integrationTypesPredicate2 = import_shapeshift13.s.array( - import_shapeshift13.s.nativeEnum(import_v1034.ApplicationIntegrationType).setValidationEnabled(isValidationEnabled) +var integrationTypesPredicate2 = import_shapeshift16.s.array( + import_shapeshift16.s.nativeEnum(import_v1040.ApplicationIntegrationType).setValidationEnabled(isValidationEnabled) ); // src/interactions/contextMenuCommands/ContextMenuCommandBuilder.ts @@ -3680,7 +4156,7 @@ function embedLength(data) { __name(embedLength, "embedLength"); // src/index.ts -var version = "1.11.3"; +var version = "1.13.1"; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ActionRowBuilder, @@ -3701,6 +4177,10 @@ var version = "1.11.3"; EmbedAssertions, EmbedBuilder, FileBuilder, + FileUploadAssertions, + FileUploadBuilder, + LabelAssertions, + LabelBuilder, MediaGalleryBuilder, MediaGalleryItemBuilder, MentionableSelectMenuBuilder, @@ -3708,6 +4188,7 @@ var version = "1.11.3"; ModalBuilder, RoleSelectMenuBuilder, SectionBuilder, + SelectMenuAssertions, SelectMenuBuilder, SelectMenuOptionBuilder, SeparatorBuilder, diff --git a/node_modules/@discordjs/builders/dist/index.js.map b/node_modules/@discordjs/builders/dist/index.js.map index 47769e9..051e7c2 100644 --- a/node_modules/@discordjs/builders/dist/index.js.map +++ b/node_modules/@discordjs/builders/dist/index.js.map @@ -1 +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/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/components/v2/Container.ts","../src/components/v2/Assertions.ts","../src/components/v2/Thumbnail.ts","../src/components/v2/File.ts","../src/components/v2/Separator.ts","../src/components/v2/TextDisplay.ts","../src/components/v2/MediaGallery.ts","../src/components/v2/MediaGalleryItem.ts","../src/components/v2/Section.ts","../src/interactions/modals/Assertions.ts","../src/interactions/modals/Modal.ts","../src/interactions/slashCommands/Assertions.ts","../src/interactions/slashCommands/SlashCommandBuilder.ts","../src/interactions/slashCommands/mixins/NameAndDescription.ts","../src/interactions/slashCommands/mixins/SharedSlashCommand.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/ApplicationCommandOptionWithAutocompleteMixin.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesMixin.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/slashCommands/SlashCommandSubcommands.ts","../src/interactions/slashCommands/mixins/SharedSubcommands.ts","../src/interactions/contextMenuCommands/Assertions.ts","../src/interactions/contextMenuCommands/ContextMenuCommandBuilder.ts","../src/util/componentUtil.ts"],"sourcesContent":["export * as EmbedAssertions from './messages/embed/Assertions.js';\nexport * from './messages/embed/Embed.js';\n// TODO: Consider removing this dep in the next major version\nexport * from '@discordjs/formatters';\n\nexport * as ComponentAssertions from './components/Assertions.js';\nexport * from './components/ActionRow.js';\nexport * from './components/button/Button.js';\nexport * from './components/Component.js';\nexport * from './components/Components.js';\nexport * from './components/textInput/TextInput.js';\nexport * as TextInputAssertions from './components/textInput/Assertions.js';\nexport * from './interactions/modals/Modal.js';\nexport * as ModalAssertions from './interactions/modals/Assertions.js';\n\nexport * from './components/selectMenu/BaseSelectMenu.js';\nexport * from './components/selectMenu/ChannelSelectMenu.js';\nexport * from './components/selectMenu/MentionableSelectMenu.js';\nexport * from './components/selectMenu/RoleSelectMenu.js';\nexport * from './components/selectMenu/StringSelectMenu.js';\n// TODO: Remove those aliases in v2\nexport {\n\t/**\n\t * @deprecated Will be removed in the next major version, use {@link StringSelectMenuBuilder} instead.\n\t */\n\tStringSelectMenuBuilder as SelectMenuBuilder,\n} from './components/selectMenu/StringSelectMenu.js';\nexport {\n\t/**\n\t * @deprecated Will be removed in the next major version, use {@link StringSelectMenuOptionBuilder} instead.\n\t */\n\tStringSelectMenuOptionBuilder as SelectMenuOptionBuilder,\n} from './components/selectMenu/StringSelectMenuOption.js';\nexport * from './components/selectMenu/StringSelectMenuOption.js';\nexport * from './components/selectMenu/UserSelectMenu.js';\n\nexport * as ComponentsV2Assertions from './components/v2/Assertions.js';\nexport * from './components/v2/Container.js';\nexport * from './components/v2/File.js';\nexport * from './components/v2/MediaGallery.js';\nexport * from './components/v2/MediaGalleryItem.js';\nexport * from './components/v2/Section.js';\nexport * from './components/v2/Separator.js';\nexport * from './components/v2/TextDisplay.js';\nexport * from './components/v2/Thumbnail.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/ApplicationCommandOptionWithAutocompleteMixin.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesMixin.js';\nexport * from './interactions/slashCommands/mixins/NameAndDescription.js';\nexport * from './interactions/slashCommands/mixins/SharedSlashCommandOptions.js';\nexport * from './interactions/slashCommands/mixins/SharedSubcommands.js';\nexport * from './interactions/slashCommands/mixins/SharedSlashCommand.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';\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 * @privateRemarks This needs to explicitly be `string` so it is not typed as a \"const string\" that gets injected by esbuild.\n */\nexport const version = '1.11.3' as string;\n","import { s } from '@sapphire/shapeshift';\nimport type { APIEmbedField } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\n\nexport const fieldNamePredicate = s.string().lengthLessThanOrEqual(256).setValidationEnabled(isValidationEnabled);\n\nexport const fieldValuePredicate = s.string().lengthLessThanOrEqual(1_024).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\n\t.lengthGreaterThanOrEqual(1)\n\t.nullable()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const imageURLPredicate = s\n\t.string()\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:', 'attachment:'],\n\t})\n\t.nullish()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const urlPredicate = s\n\t.string()\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:'],\n\t})\n\t.nullish()\n\t.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\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(255)\n\t.setValidationEnabled(isValidationEnabled);\nexport const colorPredicate = s\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(0xffffff)\n\t.or(s.tuple([RGBPredicate, RGBPredicate, RGBPredicate]))\n\t.nullable()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const descriptionPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(4_096)\n\t.nullable()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const footerTextPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(2_048)\n\t.nullable()\n\t.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\n\t.lengthGreaterThanOrEqual(1)\n\t.nullable()\n\t.setValidationEnabled(isValidationEnabled);\n","let validate = true;\n\n/**\n * Enables validators.\n *\n * @returns Whether validation is occurring.\n */\nexport function enableValidators() {\n\treturn (validate = true);\n}\n\n/**\n * Disables validators.\n *\n * @returns Whether validation is occurring.\n */\nexport function disableValidators() {\n\treturn (validate = false);\n}\n\n/**\n * Checks whether validation is occurring.\n */\nexport function isValidationEnabled() {\n\treturn validate;\n}\n","/**\n * Normalizes data that is a rest parameter or an array into an array with a depth of 1.\n *\n * @typeParam ItemType - The data that must satisfy {@link RestOrArray}.\n * @param arr - The (possibly variadic) data to normalize\n */\nexport function normalizeArray(arr: RestOrArray): ItemType[] {\n\tif (Array.isArray(arr[0])) return [...arr[0]];\n\treturn arr as ItemType[];\n}\n\n/**\n * Represents data that may be an array or came from a rest parameter.\n *\n * @remarks\n * This type is used throughout builders to ensure both an array and variadic arguments\n * may be used. It is normalized with {@link normalizeArray}.\n */\nexport type RestOrArray = Type[] | [Type[]];\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\n/**\n * A tuple satisfying the RGB color model.\n *\n * @see {@link https://developer.mozilla.org/docs/Glossary/RGB}\n */\nexport type RGBTuple = [red: number, green: number, blue: number];\n\n/**\n * The base icon data typically used in payloads.\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\n/**\n * Represents the author data of an embed.\n */\nexport interface EmbedAuthorData extends IconData, Omit {}\n\n/**\n * Represents the author options of an embed.\n */\nexport interface EmbedAuthorOptions extends Omit {}\n\n/**\n * Represents the footer data of an embed.\n */\nexport interface EmbedFooterData extends IconData, Omit {}\n\n/**\n * Represents the footer options of an embed.\n */\nexport interface EmbedFooterOptions extends Omit {}\n\n/**\n * Represents the image data of an embed.\n */\nexport interface EmbedImageData extends Omit {\n\t/**\n\t * The proxy URL for the image.\n\t */\n\tproxyURL?: string;\n}\n\n/**\n * A builder that creates API-compatible JSON data for embeds.\n */\nexport class EmbedBuilder {\n\t/**\n\t * The API data associated with this embed.\n\t */\n\tpublic readonly data: APIEmbed;\n\n\t/**\n\t * Creates a new embed from API data.\n\t *\n\t * @param data - The API data to create this embed with\n\t */\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\tconst normalizedFields = normalizeArray(fields);\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(normalizedFields.length, this.data.fields);\n\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(normalizedFields);\n\n\t\tif (this.data.fields) this.data.fields.push(...normalizedFields);\n\t\telse this.data.fields = normalizedFields;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts fields for this embed.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t * The maximum amount of fields that can be added is 25.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing fields of an embed.\n\t * @example\n\t * Remove the first field:\n\t * ```ts\n\t * embed.spliceFields(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n fields:\n\t * ```ts\n\t * const n = 4;\n\t * embed.spliceFields(0, n);\n\t * ```\n\t * @example\n\t * Remove the last field:\n\t * ```ts\n\t * embed.spliceFields(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of fields to remove\n\t * @param fields - The replacing field objects\n\t */\n\tpublic spliceFields(index: number, deleteCount: number, ...fields: APIEmbedField[]): this {\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(fields.length - deleteCount, this.data.fields);\n\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(fields);\n\t\tif (this.data.fields) this.data.fields.splice(index, deleteCount, ...fields);\n\t\telse this.data.fields = fields;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the fields for this embed.\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): this {\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 to use\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 to use\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 to use\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 footer to use\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 image URL to use\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 thumbnail URL to use\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 to use\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 for this embed.\n\t *\n\t * @param title - The title to use\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 to use\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 * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIEmbed {\n\t\treturn { ...this.data };\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ButtonStyle, ChannelType, type APIMessageComponentEmoji } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../util/validation.js';\nimport { StringSelectMenuOptionBuilder } from './selectMenu/StringSelectMenuOption.js';\n\nexport const idValidator = s\n\t.number()\n\t.safeInt()\n\t.greaterThanOrEqual(1)\n\t.lessThan(4_294_967_296) // 2^32 - 1\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const customIdValidator = s\n\t.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()\n\t.strict()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const disabledValidator = s.boolean();\n\nexport const buttonLabelValidator = s\n\t.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\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(25)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const labelValueDescriptionValidator = s\n\t.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\n\t.array()\n\t.lengthGreaterThanOrEqual(0)\n\t.setValidationEnabled(isValidationEnabled);\nexport const optionsLengthValidator = s\n\t.number()\n\t.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\n\t.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\tskuId?: string,\n\turl?: string,\n) {\n\tif (style === ButtonStyle.Premium) {\n\t\tif (!skuId) {\n\t\t\tthrow new RangeError('Premium buttons must have an SKU id.');\n\t\t}\n\n\t\tif (customId || label || url || emoji) {\n\t\t\tthrow new RangeError('Premium buttons cannot have a custom id, label, URL, or emoji.');\n\t\t}\n\t} else {\n\t\tif (skuId) {\n\t\t\tthrow new RangeError('Non-premium buttons must not have an SKU id.');\n\t\t}\n\n\t\tif (url && customId) {\n\t\t\tthrow new RangeError('URL and custom id are mutually exclusive.');\n\t\t}\n\n\t\tif (!label && !emoji) {\n\t\t\tthrow new RangeError('Non-premium buttons must have a label and/or an emoji.');\n\t\t}\n\n\t\tif (style === ButtonStyle.Link) {\n\t\t\tif (!url) {\n\t\t\t\tthrow new RangeError('Link buttons must have a URL.');\n\t\t\t}\n\t\t} else if (url) {\n\t\t\tthrow new RangeError('Non-premium and non-link buttons cannot have a URL.');\n\t\t}\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 * A builder that creates API-compatible JSON data for string select menu options.\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 for this option.\n\t *\n\t * @param label - The label to use\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 for this option.\n\t *\n\t * @param value - The value to use\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 for this option.\n\t *\n\t * @param description - The description to use\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 for this option.\n\t *\n\t * @param emoji - The emoji to use\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 BaseSelectMenuBuilder.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 APIComponentInMessageActionRow,\n\ttype APIComponentInModalActionRow,\n\ttype APIComponentInActionRow,\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\n/**\n * The builders that may be used for modals.\n */\nexport type ModalComponentBuilder = ActionRowBuilder | ModalActionRowComponentBuilder;\n\n/**\n * The builders that may be used within an action row for messages.\n */\nexport type MessageActionRowComponentBuilder =\n\t| ButtonBuilder\n\t| ChannelSelectMenuBuilder\n\t| MentionableSelectMenuBuilder\n\t| RoleSelectMenuBuilder\n\t| StringSelectMenuBuilder\n\t| UserSelectMenuBuilder;\n\n/**\n * The builders that may be used within an action row for modals.\n */\nexport type ModalActionRowComponentBuilder = TextInputBuilder;\n\n/**\n * Any builder.\n */\nexport type AnyComponentBuilder = MessageActionRowComponentBuilder | ModalActionRowComponentBuilder;\n\n/**\n * A builder that creates API-compatible JSON data for action rows.\n *\n * @typeParam ComponentType - 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: ComponentType[];\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 ComponentType[];\n\t}\n\n\t/**\n\t * Adds components to this action row.\n\t *\n\t * @param components - The components to add\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 components for this action row.\n\t *\n\t * @param components - The components to set\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\tAPIComponentInActionRow,\n\tAPIBaseComponent,\n\tComponentType,\n\tAPIMessageComponent,\n} from 'discord-api-types/v10';\nimport { idValidator } from './Assertions';\n\n/**\n * Any action row component data represented as an object.\n */\nexport type AnyAPIActionRowComponent =\n\t| APIActionRowComponent\n\t| APIComponentInActionRow\n\t| APIMessageComponent;\n\n/**\n * The base component builder that contains common symbols for all sorts of components.\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 builder to API-compatible JSON data.\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\t/**\n\t * Constructs a new kind of component.\n\t *\n\t * @param data - The data to construct a component out of\n\t */\n\tpublic constructor(data: Partial) {\n\t\tthis.data = data;\n\t}\n\n\t/**\n\t * Sets the id (not the custom id) for this component.\n\t *\n\t * @param id - The id for this component\n\t */\n\tpublic setId(id: number) {\n\t\tthis.data.id = idValidator.parse(id);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the id of this component, defaulting to a default incremented id.\n\t */\n\tpublic clearId() {\n\t\tthis.data.id = undefined;\n\t\treturn this;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport { ComponentType, type APIMessageComponent, type APIModalComponent } from 'discord-api-types/v10';\nimport {\n\tActionRowBuilder,\n\ttype MessageActionRowComponentBuilder,\n\ttype AnyComponentBuilder,\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';\nimport { ContainerBuilder } from './v2/Container.js';\nimport { FileBuilder } from './v2/File.js';\nimport { MediaGalleryBuilder } from './v2/MediaGallery.js';\nimport { SectionBuilder } from './v2/Section.js';\nimport { SeparatorBuilder } from './v2/Separator.js';\nimport { TextDisplayBuilder } from './v2/TextDisplay.js';\nimport { ThumbnailBuilder } from './v2/Thumbnail.js';\n\n/**\n * The builders that may be used for messages.\n */\nexport type MessageComponentBuilder =\n\t| ActionRowBuilder\n\t| ContainerBuilder\n\t| FileBuilder\n\t| MediaGalleryBuilder\n\t| MessageActionRowComponentBuilder\n\t| SectionBuilder\n\t| SeparatorBuilder\n\t| TextDisplayBuilder\n\t| ThumbnailBuilder;\n\n/**\n * Components here are mapped to their respective builder.\n */\nexport interface MappedComponentTypes {\n\t/**\n\t * The action row component type is associated with an {@link ActionRowBuilder}.\n\t */\n\t[ComponentType.ActionRow]: ActionRowBuilder;\n\t/**\n\t * The button component type is associated with a {@link ButtonBuilder}.\n\t */\n\t[ComponentType.Button]: ButtonBuilder;\n\t/**\n\t * The string select component type is associated with a {@link StringSelectMenuBuilder}.\n\t */\n\t[ComponentType.StringSelect]: StringSelectMenuBuilder;\n\t/**\n\t * The text input component type is associated with a {@link TextInputBuilder}.\n\t */\n\t[ComponentType.TextInput]: TextInputBuilder;\n\t/**\n\t * The user select component type is associated with a {@link UserSelectMenuBuilder}.\n\t */\n\t[ComponentType.UserSelect]: UserSelectMenuBuilder;\n\t/**\n\t * The role select component type is associated with a {@link RoleSelectMenuBuilder}.\n\t */\n\t[ComponentType.RoleSelect]: RoleSelectMenuBuilder;\n\t/**\n\t * The mentionable select component type is associated with a {@link MentionableSelectMenuBuilder}.\n\t */\n\t[ComponentType.MentionableSelect]: MentionableSelectMenuBuilder;\n\t/**\n\t * The channel select component type is associated with a {@link ChannelSelectMenuBuilder}.\n\t */\n\t[ComponentType.ChannelSelect]: ChannelSelectMenuBuilder;\n\t/**\n\t * The file component type is associated with a {@link FileBuilder}.\n\t */\n\t[ComponentType.File]: FileBuilder;\n\t/**\n\t * The separator component type is associated with a {@link SeparatorBuilder}.\n\t */\n\t[ComponentType.Separator]: SeparatorBuilder;\n\t/**\n\t * The container component type is associated with a {@link ContainerBuilder}.\n\t */\n\t[ComponentType.Container]: ContainerBuilder;\n\t/**\n\t * The text display component type is associated with a {@link TextDisplayBuilder}.\n\t */\n\t[ComponentType.TextDisplay]: TextDisplayBuilder;\n\t/**\n\t * The thumbnail component type is associated with a {@link ThumbnailBuilder}.\n\t */\n\t[ComponentType.Thumbnail]: ThumbnailBuilder;\n\t/**\n\t * The section component type is associated with a {@link SectionBuilder}.\n\t */\n\t[ComponentType.Section]: SectionBuilder;\n\t/**\n\t * The media gallery component type is associated with a {@link MediaGalleryBuilder}.\n\t */\n\t[ComponentType.MediaGallery]: MediaGalleryBuilder;\n}\n\n/**\n * Factory for creating components from API data.\n *\n * @typeParam ComponentType - The type of component to use\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-constituents\n\tdata: (APIModalComponent | APIMessageComponent) & { type: ComponentType },\n): MappedComponentTypes[ComponentType];\n\n/**\n * Factory for creating components from API data.\n *\n * @typeParam ComponentBuilder - The type of component to use\n * @param data - The API data to transform to a component class\n */\nexport function createComponentBuilder(\n\tdata: ComponentBuilder,\n): ComponentBuilder;\n\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\tcase ComponentType.File:\n\t\t\treturn new FileBuilder(data);\n\t\tcase ComponentType.Container:\n\t\t\treturn new ContainerBuilder(data);\n\t\tcase ComponentType.Section:\n\t\t\treturn new SectionBuilder(data);\n\t\tcase ComponentType.Separator:\n\t\t\treturn new SeparatorBuilder(data);\n\t\tcase ComponentType.TextDisplay:\n\t\t\treturn new TextDisplayBuilder(data);\n\t\tcase ComponentType.Thumbnail:\n\t\t\treturn new ThumbnailBuilder(data);\n\t\tcase ComponentType.MediaGallery:\n\t\t\treturn new MediaGalleryBuilder(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\nfunction isBuilder>(\n\tbuilder: unknown,\n\tConstructor: new () => Builder,\n): builder is Builder {\n\treturn builder instanceof Constructor;\n}\n\nexport function resolveBuilder, Builder extends JSONEncodable>(\n\tbuilder: Builder | ComponentType | ((builder: Builder) => Builder),\n\tConstructor: new (data?: ComponentType) => Builder,\n) {\n\tif (isBuilder(builder, Constructor)) {\n\t\treturn builder;\n\t}\n\n\tif (typeof builder === 'function') {\n\t\treturn builder(new Constructor());\n\t}\n\n\treturn new Constructor(builder);\n}\n","import {\n\tComponentType,\n\ttype APIButtonComponent,\n\ttype APIButtonComponentWithCustomId,\n\ttype APIButtonComponentWithSKUId,\n\ttype APIButtonComponentWithURL,\n\ttype APIMessageComponentEmoji,\n\ttype ButtonStyle,\n\ttype Snowflake,\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 * A builder that creates API-compatible JSON data for buttons.\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 to use\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 use\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\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 SKU id that represents a purchasable SKU for this button.\n\t *\n\t * @remarks Only available when using premium-style buttons.\n\t * @param skuId - The SKU id to use\n\t */\n\tpublic setSKUId(skuId: Snowflake) {\n\t\t(this.data as APIButtonComponentWithSKUId).sku_id = skuId;\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 use\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\t(this.data as Exclude).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 use\n\t */\n\tpublic setLabel(label: string) {\n\t\t(this.data as Exclude).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\t(this.data as Exclude).label,\n\t\t\t(this.data as Exclude).emoji,\n\t\t\t(this.data as APIButtonComponentWithCustomId).custom_id,\n\t\t\t(this.data as APIButtonComponentWithSKUId).sku_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 {\n\ttype APIChannelSelectComponent,\n\ttype ChannelType,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { channelTypesValidator, customIdValidator, optionsLengthValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for channel select menus.\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\t/**\n\t * Adds channel types to this select menu.\n\t *\n\t * @param types - The channel types to use\n\t */\n\tpublic addChannelTypes(...types: RestOrArray) {\n\t\tconst normalizedTypes = normalizeArray(types);\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.push(...channelTypesValidator.parse(normalizedTypes));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets channel types for this select menu.\n\t *\n\t * @param types - The channel types to use\n\t */\n\tpublic setChannelTypes(...types: RestOrArray) {\n\t\tconst normalizedTypes = normalizeArray(types);\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.splice(0, this.data.channel_types.length, ...channelTypesValidator.parse(normalizedTypes));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default channels to this auto populated select menu.\n\t *\n\t * @param channels - The channels to add\n\t */\n\tpublic addDefaultChannels(...channels: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(channels);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Channel as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default channels for this auto populated select menu.\n\t *\n\t * @param channels - The channels to set\n\t */\n\tpublic setDefaultChannels(...channels: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(channels);\n\t\toptionsLengthValidator.parse(normalizedValues.length);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.Channel as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc BaseSelectMenuBuilder.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\n/**\n * The base select menu builder that contains common symbols for select menu builders.\n *\n * @typeParam SelectMenuType - The type of select menu this would be instantiated for.\n */\nexport abstract 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\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\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\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\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 {\n\ttype APIMentionableSelectComponent,\n\ttype APISelectMenuDefaultValue,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { optionsLengthValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for mentionable select menus.\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\t/**\n\t * Adds default roles to this auto populated select menu.\n\t *\n\t * @param roles - The roles to add\n\t */\n\tpublic addDefaultRoles(...roles: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default users to this auto populated select menu.\n\t *\n\t * @param users - The users to add\n\t */\n\tpublic addDefaultUsers(...users: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(users);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default values to this auto populated select menu.\n\t *\n\t * @param values - The values to add\n\t */\n\tpublic addDefaultValues(\n\t\t...values: RestOrArray<\n\t\t\t| APISelectMenuDefaultValue\n\t\t\t| APISelectMenuDefaultValue\n\t\t>\n\t) {\n\t\tconst normalizedValues = normalizeArray(values);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\t\tthis.data.default_values.push(...normalizedValues);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default values for this auto populated select menu.\n\t *\n\t * @param values - The values to set\n\t */\n\tpublic setDefaultValues(\n\t\t...values: RestOrArray<\n\t\t\t| APISelectMenuDefaultValue\n\t\t\t| APISelectMenuDefaultValue\n\t\t>\n\t) {\n\t\tconst normalizedValues = normalizeArray(values);\n\t\toptionsLengthValidator.parse(normalizedValues.length);\n\t\tthis.data.default_values = normalizedValues;\n\t\treturn this;\n\t}\n}\n","import {\n\ttype APIRoleSelectComponent,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { optionsLengthValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for role select menus.\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\t/**\n\t * Adds default roles to this auto populated select menu.\n\t *\n\t * @param roles - The roles to add\n\t */\n\tpublic addDefaultRoles(...roles: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default roles for this auto populated select menu.\n\t *\n\t * @param roles - The roles to set\n\t */\n\tpublic setDefaultRoles(...roles: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\t\toptionsLengthValidator.parse(normalizedValues.length);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n}\n","import { ComponentType } from 'discord-api-types/v10';\nimport type { APIStringSelectComponent, 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 * A builder that creates API-compatible JSON data for string select menus.\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\n\t */\n\tpublic addOptions(...options: RestOrArray) {\n\t\tconst normalizedOptions = normalizeArray(options);\n\t\toptionsLengthValidator.parse(this.options.length + normalizedOptions.length);\n\t\tthis.options.push(\n\t\t\t...normalizedOptions.map((normalizedOption) =>\n\t\t\t\tnormalizedOption instanceof StringSelectMenuOptionBuilder\n\t\t\t\t\t? normalizedOption\n\t\t\t\t\t: new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(normalizedOption)),\n\t\t\t),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the options for this select menu.\n\t *\n\t * @param options - The options to set\n\t */\n\tpublic setOptions(...options: RestOrArray) {\n\t\treturn this.spliceOptions(0, this.options.length, ...options);\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts options for this select menu.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | Array.prototype.splice()}.\n\t * It's useful for modifying and adjusting the order of existing options.\n\t * @example\n\t * Remove the first option:\n\t * ```ts\n\t * selectMenu.spliceOptions(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n option:\n\t * ```ts\n\t * const n = 4;\n\t * selectMenu.spliceOptions(0, n);\n\t * ```\n\t * @example\n\t * Remove the last option:\n\t * ```ts\n\t * selectMenu.spliceOptions(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of options to remove\n\t * @param options - The replacing option objects or builders\n\t */\n\tpublic spliceOptions(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...options: RestOrArray\n\t) {\n\t\tconst normalizedOptions = normalizeArray(options);\n\n\t\tconst clone = [...this.options];\n\n\t\tclone.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...normalizedOptions.map((normalizedOption) =>\n\t\t\t\tnormalizedOption instanceof StringSelectMenuOptionBuilder\n\t\t\t\t\t? normalizedOption\n\t\t\t\t\t: new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(normalizedOption)),\n\t\t\t),\n\t\t);\n\n\t\toptionsLengthValidator.parse(clone.length);\n\t\tthis.options.splice(0, this.options.length, ...clone);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc BaseSelectMenuBuilder.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 {\n\ttype APIUserSelectComponent,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { optionsLengthValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for user select menus.\n */\nexport class UserSelectMenuBuilder extends BaseSelectMenuBuilder {\n\t/**\n\t * Creates a new select menu from API data.\n\t *\n\t * @param data - The API data to create this select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new UserSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new UserSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1);\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ ...data, type: ComponentType.UserSelect });\n\t}\n\n\t/**\n\t * Adds default users to this auto populated select menu.\n\t *\n\t * @param users - The users to add\n\t */\n\tpublic addDefaultUsers(...users: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(users);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default users for this auto populated select menu.\n\t *\n\t * @param users - The users to set\n\t */\n\tpublic setDefaultUsers(...users: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(users);\n\t\toptionsLengthValidator.parse(normalizedValues.length);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n}\n","import { isJSONEncodable, type Equatable, type JSONEncodable } from '@discordjs/util';\nimport { ComponentType, type TextInputStyle, type APITextInputComponent } from 'discord-api-types/v10';\nimport isEqual from 'fast-deep-equal';\nimport { customIdValidator } from '../Assertions.js';\nimport { ComponentBuilder } from '../Component.js';\nimport {\n\tmaxLengthValidator,\n\tminLengthValidator,\n\tplaceholderValidator,\n\trequiredValidator,\n\tvalueValidator,\n\tvalidateRequiredParameters,\n\tlabelValidator,\n\ttextInputStyleValidator,\n} from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for text inputs.\n */\nexport class TextInputBuilder\n\textends ComponentBuilder\n\timplements Equatable>\n{\n\t/**\n\t * Creates a new text input from API data.\n\t *\n\t * @param data - The API data to create this text input with\n\t * @example\n\t * Creating a text input from an API data object:\n\t * ```ts\n\t * const textInput = new TextInputBuilder({\n\t * \tcustom_id: 'a cool text input',\n\t * \tlabel: 'Type something',\n\t * \tstyle: TextInputStyle.Short,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a text input using setters and API data:\n\t * ```ts\n\t * const textInput = new TextInputBuilder({\n\t * \tlabel: 'Type something else',\n\t * })\n\t * \t.setCustomId('woah')\n\t * \t.setStyle(TextInputStyle.Paragraph);\n\t * ```\n\t */\n\tpublic constructor(data?: APITextInputComponent & { type?: ComponentType.TextInput }) {\n\t\tsuper({ type: ComponentType.TextInput, ...data });\n\t}\n\n\t/**\n\t * Sets the custom id for this text input.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the label for this text input.\n\t *\n\t * @param label - The label to use\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = labelValidator.parse(label);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the style for this text input.\n\t *\n\t * @param style - The style to use\n\t */\n\tpublic setStyle(style: TextInputStyle) {\n\t\tthis.data.style = textInputStyleValidator.parse(style);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum length of text for this text input.\n\t *\n\t * @param minLength - The minimum length of text for this text input\n\t */\n\tpublic setMinLength(minLength: number) {\n\t\tthis.data.min_length = minLengthValidator.parse(minLength);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum length of text for this text input.\n\t *\n\t * @param maxLength - The maximum length of text for this text input\n\t */\n\tpublic setMaxLength(maxLength: number) {\n\t\tthis.data.max_length = maxLengthValidator.parse(maxLength);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the placeholder for this text input.\n\t *\n\t * @param placeholder - The placeholder to use\n\t */\n\tpublic setPlaceholder(placeholder: string) {\n\t\tthis.data.placeholder = placeholderValidator.parse(placeholder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value for this text input.\n\t *\n\t * @param value - The value to use\n\t */\n\tpublic setValue(value: string) {\n\t\tthis.data.value = valueValidator.parse(value);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this text input is required.\n\t *\n\t * @param required - Whether this text input is required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = requiredValidator.parse(required);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APITextInputComponent {\n\t\tvalidateRequiredParameters(this.data.custom_id, this.data.style, this.data.label);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as APITextInputComponent;\n\t}\n\n\t/**\n\t * Whether this is equal to another structure.\n\t */\n\tpublic equals(other: APITextInputComponent | JSONEncodable): boolean {\n\t\tif (isJSONEncodable(other)) {\n\t\t\treturn isEqual(other.toJSON(), this.data);\n\t\t}\n\n\t\treturn isEqual(other, this.data);\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { TextInputStyle } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport { customIdValidator } from '../Assertions.js';\n\nexport const textInputStyleValidator = s.nativeEnum(TextInputStyle);\nexport const minLengthValidator = s\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(4_000)\n\t.setValidationEnabled(isValidationEnabled);\nexport const maxLengthValidator = s\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(1)\n\t.lessThanOrEqual(4_000)\n\t.setValidationEnabled(isValidationEnabled);\nexport const requiredValidator = s.boolean();\nexport const valueValidator = s.string().lengthLessThanOrEqual(4_000).setValidationEnabled(isValidationEnabled);\nexport const placeholderValidator = s.string().lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);\nexport const labelValidator = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(45)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredParameters(customId?: string, style?: TextInputStyle, label?: string) {\n\tcustomIdValidator.parse(customId);\n\ttextInputStyleValidator.parse(style);\n\tlabelValidator.parse(label);\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport type {\n\tAPIActionRowComponent,\n\tAPIComponentInContainer,\n\tAPIComponentInMessageActionRow,\n\tAPIContainerComponent,\n\tAPIFileComponent,\n\tAPIMediaGalleryComponent,\n\tAPISectionComponent,\n\tAPISeparatorComponent,\n\tAPITextDisplayComponent,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport type { RGBTuple } from '../../index.js';\nimport { MediaGalleryBuilder, SectionBuilder } from '../../index.js';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport type { AnyComponentBuilder, MessageActionRowComponentBuilder } from '../ActionRow.js';\nimport { ActionRowBuilder } from '../ActionRow.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { createComponentBuilder, resolveBuilder } from '../Components.js';\nimport { containerColorPredicate, spoilerPredicate } from './Assertions.js';\nimport { FileBuilder } from './File.js';\nimport { SeparatorBuilder } from './Separator.js';\nimport { TextDisplayBuilder } from './TextDisplay.js';\n\n/**\n * The builders that may be used within a container.\n */\nexport type ContainerComponentBuilder =\n\t| ActionRowBuilder\n\t| FileBuilder\n\t| MediaGalleryBuilder\n\t| SectionBuilder\n\t| SeparatorBuilder\n\t| TextDisplayBuilder;\n\n/**\n * A builder that creates API-compatible JSON data for a container.\n */\nexport class ContainerBuilder extends ComponentBuilder {\n\t/**\n\t * The components within this container.\n\t */\n\tpublic readonly components: ContainerComponentBuilder[];\n\n\t/**\n\t * Creates a new container from API data.\n\t *\n\t * @param data - The API data to create this container with\n\t * @example\n\t * Creating a container from an API data object:\n\t * ```ts\n\t * const container = new ContainerBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"Some text here\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating a container using setters and API data:\n\t * ```ts\n\t * const container = new ContainerBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"# Heading\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.addComponents(separator, section);\n\t * ```\n\t */\n\tpublic constructor({ components, ...data }: Partial = {}) {\n\t\tsuper({ type: ComponentType.Container, ...data });\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ??\n\t\t\t[]) as ContainerComponentBuilder[];\n\t}\n\n\t/**\n\t * Sets the accent color of this container.\n\t *\n\t * @param color - The color to use\n\t */\n\tpublic setAccentColor(color?: RGBTuple | number): this {\n\t\t// Data assertions\n\t\tcontainerColorPredicate.parse(color);\n\n\t\tif (Array.isArray(color)) {\n\t\t\tconst [red, green, blue] = color;\n\t\t\tthis.data.accent_color = (red << 16) + (green << 8) + blue;\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.data.accent_color = color;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the accent color of this container.\n\t */\n\tpublic clearAccentColor() {\n\t\tthis.data.accent_color = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds action row components to this container.\n\t *\n\t * @param components - The action row components to add\n\t */\n\tpublic addActionRowComponents(\n\t\t...components: RestOrArray<\n\t\t\t| ActionRowBuilder\n\t\t\t| APIActionRowComponent\n\t\t\t| ((builder: ActionRowBuilder) => ActionRowBuilder)\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component) => resolveBuilder(component, ActionRowBuilder)),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds file components to this container.\n\t *\n\t * @param components - The file components to add\n\t */\n\tpublic addFileComponents(\n\t\t...components: RestOrArray FileBuilder)>\n\t) {\n\t\tthis.components.push(...normalizeArray(components).map((component) => resolveBuilder(component, FileBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds media gallery components to this container.\n\t *\n\t * @param components - The media gallery components to add\n\t */\n\tpublic addMediaGalleryComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPIMediaGalleryComponent | MediaGalleryBuilder | ((builder: MediaGalleryBuilder) => MediaGalleryBuilder)\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component) => resolveBuilder(component, MediaGalleryBuilder)),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds section components to this container.\n\t *\n\t * @param components - The section components to add\n\t */\n\tpublic addSectionComponents(\n\t\t...components: RestOrArray SectionBuilder)>\n\t) {\n\t\tthis.components.push(...normalizeArray(components).map((component) => resolveBuilder(component, SectionBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds separator components to this container.\n\t *\n\t * @param components - The separator components to add\n\t */\n\tpublic addSeparatorComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPISeparatorComponent | SeparatorBuilder | ((builder: SeparatorBuilder) => SeparatorBuilder)\n\t\t>\n\t) {\n\t\tthis.components.push(...normalizeArray(components).map((component) => resolveBuilder(component, SeparatorBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds text display components to this container.\n\t *\n\t * @param components - The text display components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component) => resolveBuilder(component, TextDisplayBuilder)),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts components for this container.\n\t *\n\t * @param index - The index to start removing, replacing or inserting components\n\t * @param deleteCount - The amount of components to remove\n\t * @param components - The components to set\n\t */\n\tpublic spliceComponents(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...components: RestOrArray\n\t) {\n\t\tthis.components.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...normalizeArray(components).map((component) =>\n\t\t\t\tcomponent instanceof ComponentBuilder ? component : createComponentBuilder(component),\n\t\t\t),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this container.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoilerPredicate.parse(spoiler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIContainerComponent {\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t} as APIContainerComponent;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { SeparatorSpacingSize } from 'discord-api-types/v10';\nimport { colorPredicate } from '../../messages/embed/Assertions';\nimport { isValidationEnabled } from '../../util/validation';\nimport { ComponentBuilder } from '../Component';\nimport { ButtonBuilder } from '../button/Button';\nimport type { ContainerComponentBuilder } from './Container';\nimport type { MediaGalleryItemBuilder } from './MediaGalleryItem';\nimport type { TextDisplayBuilder } from './TextDisplay';\nimport { ThumbnailBuilder } from './Thumbnail';\n\nexport const unfurledMediaItemPredicate = s\n\t.object({\n\t\turl: s\n\t\t\t.string()\n\t\t\t.url(\n\t\t\t\t{ allowedProtocols: ['http:', 'https:', 'attachment:'] },\n\t\t\t\t{ message: 'Invalid protocol for media URL. Must be http:, https:, or attachment:' },\n\t\t\t),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const descriptionPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(1_024)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const filePredicate = s\n\t.object({\n\t\turl: s\n\t\t\t.string()\n\t\t\t.url({ allowedProtocols: ['attachment:'] }, { message: 'Invalid protocol for file URL. Must be attachment:' }),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const spoilerPredicate = s.boolean();\n\nexport const dividerPredicate = s.boolean();\n\nexport const spacingPredicate = s.nativeEnum(SeparatorSpacingSize);\n\nexport const textDisplayContentPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(4_000)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const accessoryPredicate = s\n\t.instance(ButtonBuilder)\n\t.or(s.instance(ThumbnailBuilder))\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const containerColorPredicate = colorPredicate.nullish();\n\nexport function assertReturnOfBuilder(\n\tinput: unknown,\n\tExpectedInstanceOf: new () => ReturnType,\n): asserts input is ReturnType {\n\ts.instance(ExpectedInstanceOf).setValidationEnabled(isValidationEnabled).parse(input);\n}\n\nexport function validateComponentArray<\n\tReturnType extends ContainerComponentBuilder | MediaGalleryItemBuilder = ContainerComponentBuilder,\n>(input: unknown, min: number, max: number, ExpectedInstanceOf?: new () => ReturnType): asserts input is ReturnType[] {\n\t(ExpectedInstanceOf ? s.instance(ExpectedInstanceOf) : s.instance(ComponentBuilder))\n\t\t.array()\n\t\t.lengthGreaterThanOrEqual(min)\n\t\t.lengthLessThanOrEqual(max)\n\t\t.setValidationEnabled(isValidationEnabled)\n\t\t.parse(input);\n}\n","import type { APIThumbnailComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component';\nimport { descriptionPredicate, spoilerPredicate, unfurledMediaItemPredicate } from './Assertions';\n\nexport class ThumbnailBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new thumbnail from API data.\n\t *\n\t * @param data - The API data to create this thumbnail with\n\t * @example\n\t * Creating a thumbnail from an API data object:\n\t * ```ts\n\t * const thumbnail = new ThumbnailBuilder({\n\t * \tdescription: 'some text',\n\t * media: {\n\t * url: 'https://cdn.discordapp.com/embed/avatars/4.png',\n\t * },\n\t * });\n\t * ```\n\t * @example\n\t * Creating a thumbnail using setters and API data:\n\t * ```ts\n\t * const thumbnail = new ThumbnailBuilder({\n\t * \tmedia: {\n\t * url: 'attachment://image.png',\n\t * },\n\t * })\n\t * \t.setDescription('alt text');\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({\n\t\t\ttype: ComponentType.Thumbnail,\n\t\t\t...data,\n\t\t\tmedia: data.media ? { url: data.media.url } : undefined,\n\t\t});\n\t}\n\n\t/**\n\t * Sets the description of this thumbnail.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = descriptionPredicate.parse(description);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description of this thumbnail.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this thumbnail.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoilerPredicate.parse(spoiler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the media URL of this thumbnail.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.media = unfurledMediaItemPredicate.parse({ url });\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritdoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APIThumbnailComponent {\n\t\tunfurledMediaItemPredicate.parse(this.data.media);\n\n\t\treturn { ...this.data } as APIThumbnailComponent;\n\t}\n}\n","import { ComponentType, type APIFileComponent } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component';\nimport { filePredicate, spoilerPredicate } from './Assertions';\n\nexport class FileBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new file from API data.\n\t *\n\t * @param data - The API data to create this file with\n\t * @example\n\t * Creating a file from an API data object:\n\t * ```ts\n\t * const file = new FileBuilder({\n\t * \tspoiler: true,\n\t * \tfile: {\n\t * \t\turl: 'attachment://file.png',\n\t * \t},\n\t * });\n\t * ```\n\t * @example\n\t * Creating a file using setters and API data:\n\t * ```ts\n\t * const file = new FileBuilder({\n\t * \tfile: {\n\t * \t\turl: 'attachment://image.jpg',\n\t * \t},\n\t * })\n\t * \t.setSpoiler(false);\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({ type: ComponentType.File, ...data, file: data.file ? { url: data.file.url } : undefined });\n\t}\n\n\t/**\n\t * Sets the spoiler status of this file.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoilerPredicate.parse(spoiler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the media URL of this file.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.file = filePredicate.parse({ url });\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APIFileComponent {\n\t\tfilePredicate.parse(this.data.file);\n\n\t\treturn { ...this.data, file: { ...this.data.file } } as APIFileComponent;\n\t}\n}\n","import type { SeparatorSpacingSize, APISeparatorComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component';\nimport { dividerPredicate, spacingPredicate } from './Assertions';\n\nexport class SeparatorBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new separator from API data.\n\t *\n\t * @param data - The API data to create this separator with\n\t * @example\n\t * Creating a separator from an API data object:\n\t * ```ts\n\t * const separator = new SeparatorBuilder({\n\t * \tspacing: SeparatorSpacingSize.Small,\n\t * divider: true,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a separator using setters and API data:\n\t * ```ts\n\t * const separator = new SeparatorBuilder({\n\t * \tspacing: SeparatorSpacingSize.Large,\n\t * })\n\t * \t.setDivider(false);\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({\n\t\t\ttype: ComponentType.Separator,\n\t\t\t...data,\n\t\t});\n\t}\n\n\t/**\n\t * Sets whether this separator should show a divider line.\n\t *\n\t * @param divider - Whether to show a divider line\n\t */\n\tpublic setDivider(divider = true) {\n\t\tthis.data.divider = dividerPredicate.parse(divider);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spacing of this separator.\n\t *\n\t * @param spacing - The spacing to use\n\t */\n\tpublic setSpacing(spacing: SeparatorSpacingSize) {\n\t\tthis.data.spacing = spacingPredicate.parse(spacing);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the spacing of this separator.\n\t */\n\tpublic clearSpacing() {\n\t\tthis.data.spacing = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APISeparatorComponent {\n\t\treturn { ...this.data } as APISeparatorComponent;\n\t}\n}\n","import type { APITextDisplayComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component';\nimport { textDisplayContentPredicate } from './Assertions';\n\nexport class TextDisplayBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new text display from API data.\n\t *\n\t * @param data - The API data to create this text display with\n\t * @example\n\t * Creating a text display from an API data object:\n\t * ```ts\n\t * const textDisplay = new TextDisplayBuilder({\n\t * \tcontent: 'some text',\n\t * });\n\t * ```\n\t * @example\n\t * Creating a text display using setters and API data:\n\t * ```ts\n\t * const textDisplay = new TextDisplayBuilder({\n\t * \tcontent: 'old text',\n\t * })\n\t * \t.setContent('new text');\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({\n\t\t\ttype: ComponentType.TextDisplay,\n\t\t\t...data,\n\t\t});\n\t}\n\n\t/**\n\t * Sets the text of this text display.\n\t *\n\t * @param content - The text to use\n\t */\n\tpublic setContent(content: string) {\n\t\tthis.data.content = textDisplayContentPredicate.parse(content);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APITextDisplayComponent {\n\t\ttextDisplayContentPredicate.parse(this.data.content);\n\n\t\treturn { ...this.data } as APITextDisplayComponent;\n\t}\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport type { APIMediaGalleryComponent, APIMediaGalleryItem } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { resolveBuilder } from '../Components.js';\nimport { assertReturnOfBuilder, validateComponentArray } from './Assertions.js';\nimport { MediaGalleryItemBuilder } from './MediaGalleryItem.js';\n\n/**\n * A builder that creates API-compatible JSON data for a container.\n */\nexport class MediaGalleryBuilder extends ComponentBuilder {\n\t/**\n\t * The components within this container.\n\t */\n\tpublic readonly items: MediaGalleryItemBuilder[];\n\n\t/**\n\t * Creates a new media gallery from API data.\n\t *\n\t * @param data - The API data to create this media gallery with\n\t * @example\n\t * Creating a media gallery from an API data object:\n\t * ```ts\n\t * const mediaGallery = new MediaGalleryBuilder({\n\t * \titems: [\n\t * \t\t{\n\t * \t\t\tdescription: \"Some text here\",\n\t * \t\t\tmedia: {\n\t * \t\t\t\turl: 'https://cdn.discordapp.com/embed/avatars/2.png',\n\t * \t\t\t},\n\t * \t\t},\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating a media gallery using setters and API data:\n\t * ```ts\n\t * const mediaGallery = new MediaGalleryBuilder({\n\t * \titems: [\n\t * \t\t{\n\t * \t\t\tdescription: \"alt text\",\n\t * \t\t\tmedia: {\n\t * \t\t\t\turl: 'https://cdn.discordapp.com/embed/avatars/5.png',\n\t * \t\t\t},\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.addItems(item2, item3);\n\t * ```\n\t */\n\tpublic constructor({ items, ...data }: Partial = {}) {\n\t\tsuper({ type: ComponentType.MediaGallery, ...data });\n\t\tthis.items = items?.map((item) => new MediaGalleryItemBuilder(item)) ?? [];\n\t}\n\n\t/**\n\t * Adds items to this media gallery.\n\t *\n\t * @param items - The items to add\n\t */\n\tpublic addItems(\n\t\t...items: RestOrArray<\n\t\t\tAPIMediaGalleryItem | MediaGalleryItemBuilder | ((builder: MediaGalleryItemBuilder) => MediaGalleryItemBuilder)\n\t\t>\n\t) {\n\t\tthis.items.push(\n\t\t\t...normalizeArray(items).map((input) => {\n\t\t\t\tconst result = resolveBuilder(input, MediaGalleryItemBuilder);\n\n\t\t\t\tassertReturnOfBuilder(result, MediaGalleryItemBuilder);\n\t\t\t\treturn result;\n\t\t\t}),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts media gallery items for this media gallery.\n\t *\n\t * @param index - The index to start removing, replacing or inserting items\n\t * @param deleteCount - The amount of items to remove\n\t * @param items - The items to insert\n\t */\n\tpublic spliceItems(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...items: RestOrArray<\n\t\t\tAPIMediaGalleryItem | MediaGalleryItemBuilder | ((builder: MediaGalleryItemBuilder) => MediaGalleryItemBuilder)\n\t\t>\n\t) {\n\t\tthis.items.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...normalizeArray(items).map((input) => {\n\t\t\t\tconst result = resolveBuilder(input, MediaGalleryItemBuilder);\n\n\t\t\t\tassertReturnOfBuilder(result, MediaGalleryItemBuilder);\n\t\t\t\treturn result;\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 toJSON(): APIMediaGalleryComponent {\n\t\tvalidateComponentArray(this.items, 1, 10, MediaGalleryItemBuilder);\n\t\treturn {\n\t\t\t...this.data,\n\t\t\titems: this.items.map((item) => item.toJSON()),\n\t\t} as APIMediaGalleryComponent;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIMediaGalleryItem } from 'discord-api-types/v10';\nimport { descriptionPredicate, spoilerPredicate, unfurledMediaItemPredicate } from './Assertions';\n\nexport class MediaGalleryItemBuilder implements JSONEncodable {\n\t/**\n\t * The API data associated with this media gallery item.\n\t */\n\tpublic readonly data: Partial;\n\n\t/**\n\t * Creates a new media gallery item from API data.\n\t *\n\t * @param data - The API data to create this media gallery item with\n\t * @example\n\t * Creating a media gallery item from an API data object:\n\t * ```ts\n\t * const item = new MediaGalleryItemBuilder({\n\t * \tdescription: \"Some text here\",\n\t * \tmedia: {\n\t * \t\turl: 'https://cdn.discordapp.com/embed/avatars/2.png',\n\t * \t},\n\t * });\n\t * ```\n\t * @example\n\t * Creating a media gallery item using setters and API data:\n\t * ```ts\n\t * const item = new MediaGalleryItemBuilder({\n\t * \tmedia: {\n\t * \t\turl: 'https://cdn.discordapp.com/embed/avatars/5.png',\n\t * \t},\n\t * })\n\t * \t.setDescription(\"alt text\");\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tthis.data = data;\n\t}\n\n\t/**\n\t * Sets the description of this media gallery item.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = descriptionPredicate.parse(description);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description of this media gallery item.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this media gallery item.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoilerPredicate.parse(spoiler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the media URL of this media gallery item.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.media = unfurledMediaItemPredicate.parse({ url });\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIMediaGalleryItem {\n\t\tunfurledMediaItemPredicate.parse(this.data.media);\n\n\t\treturn { ...this.data } as APIMediaGalleryItem;\n\t}\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport type {\n\tAPIButtonComponent,\n\tAPISectionComponent,\n\tAPITextDisplayComponent,\n\tAPIThumbnailComponent,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ButtonBuilder, ThumbnailBuilder } from '../../index.js';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { createComponentBuilder, resolveBuilder } from '../Components.js';\nimport { accessoryPredicate, assertReturnOfBuilder, validateComponentArray } from './Assertions.js';\nimport { TextDisplayBuilder } from './TextDisplay.js';\n\n/**\n * A builder that creates API-compatible JSON data for a section.\n */\nexport class SectionBuilder extends ComponentBuilder {\n\t/**\n\t * The components within this section.\n\t */\n\tpublic readonly components: ComponentBuilder[];\n\n\t/**\n\t * The accessory of this section.\n\t */\n\tpublic readonly accessory?: ButtonBuilder | ThumbnailBuilder;\n\n\t/**\n\t * Creates a new section from API data.\n\t *\n\t * @param data - The API data to create this section with\n\t * @example\n\t * Creating a section from an API data object:\n\t * ```ts\n\t * const section = new SectionBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"Some text here\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * accessory: {\n\t * media: {\n\t * url: 'https://cdn.discordapp.com/embed/avatars/3.png',\n\t * },\n\t * }\n\t * });\n\t * ```\n\t * @example\n\t * Creating a section using setters and API data:\n\t * ```ts\n\t * const section = new SectionBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"# Heading\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.setPrimaryButtonAccessory(button);\n\t * ```\n\t */\n\tpublic constructor({ components, accessory, ...data }: Partial = {}) {\n\t\tsuper({ type: ComponentType.Section, ...data });\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ?? []) as ComponentBuilder[];\n\t\tthis.accessory = accessory ? createComponentBuilder(accessory) : undefined;\n\t}\n\n\t/**\n\t * Sets the accessory of this section to a button.\n\t *\n\t * @param accessory - The accessory to use\n\t */\n\tpublic setButtonAccessory(\n\t\taccessory: APIButtonComponent | ButtonBuilder | ((builder: ButtonBuilder) => ButtonBuilder),\n\t): this {\n\t\tReflect.set(this, 'accessory', accessoryPredicate.parse(resolveBuilder(accessory, ButtonBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the accessory of this section to a thumbnail.\n\t *\n\t * @param accessory - The accessory to use\n\t */\n\tpublic setThumbnailAccessory(\n\t\taccessory: APIThumbnailComponent | ThumbnailBuilder | ((builder: ThumbnailBuilder) => ThumbnailBuilder),\n\t): this {\n\t\tReflect.set(this, 'accessory', accessoryPredicate.parse(resolveBuilder(accessory, ThumbnailBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds text display components to this section.\n\t *\n\t * @param components - The text display components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...components: RestOrArray TextDisplayBuilder)>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((input) => {\n\t\t\t\tconst result = resolveBuilder(input, TextDisplayBuilder);\n\n\t\t\t\tassertReturnOfBuilder(result, TextDisplayBuilder);\n\t\t\t\treturn result;\n\t\t\t}),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts text display components for this section.\n\t *\n\t * @param index - The index to start removing, replacing or inserting text display components\n\t * @param deleteCount - The amount of text display components to remove\n\t * @param components - The text display components to insert\n\t */\n\tpublic spliceTextDisplayComponents(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...components: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t) {\n\t\tthis.components.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...normalizeArray(components).map((input) => {\n\t\t\t\tconst result = resolveBuilder(input, TextDisplayBuilder);\n\n\t\t\t\tassertReturnOfBuilder(result, TextDisplayBuilder);\n\t\t\t\treturn result;\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 toJSON(): APISectionComponent {\n\t\tvalidateComponentArray(this.components, 1, 3, TextDisplayBuilder);\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t\taccessory: accessoryPredicate.parse(this.accessory).toJSON(),\n\t\t} as APISectionComponent;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../components/ActionRow.js';\nimport { customIdValidator } from '../../components/Assertions.js';\nimport { isValidationEnabled } from '../../util/validation.js';\n\nexport const titleValidator = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(45)\n\t.setValidationEnabled(isValidationEnabled);\nexport const componentsValidator = s\n\t.instance(ActionRowBuilder)\n\t.array()\n\t.lengthGreaterThanOrEqual(1)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredParameters(\n\tcustomId?: string,\n\ttitle?: string,\n\tcomponents?: ActionRowBuilder[],\n) {\n\tcustomIdValidator.parse(customId);\n\ttitleValidator.parse(title);\n\tcomponentsValidator.parse(components);\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tAPIActionRowComponent,\n\tAPIComponentInModalActionRow,\n\tAPIModalInteractionResponseCallbackData,\n} from 'discord-api-types/v10';\nimport { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../components/ActionRow.js';\nimport { customIdValidator } from '../../components/Assertions.js';\nimport { createComponentBuilder } from '../../components/Components.js';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { titleValidator, validateRequiredParameters } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for modals.\n */\nexport class ModalBuilder implements JSONEncodable {\n\t/**\n\t * The API data associated with this modal.\n\t */\n\tpublic readonly data: Partial;\n\n\t/**\n\t * The components within this modal.\n\t */\n\tpublic readonly components: ActionRowBuilder[] = [];\n\n\t/**\n\t * Creates a new modal from API data.\n\t *\n\t * @param data - The API data to create this modal with\n\t */\n\tpublic constructor({ components, ...data }: Partial = {}) {\n\t\tthis.data = { ...data };\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ??\n\t\t\t[]) as ActionRowBuilder[];\n\t}\n\n\t/**\n\t * Sets the title of this modal.\n\t *\n\t * @param title - The title to use\n\t */\n\tpublic setTitle(title: string) {\n\t\tthis.data.title = titleValidator.parse(title);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom id of this modal.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds components to this modal.\n\t *\n\t * @param components - The components to add\n\t */\n\tpublic addComponents(\n\t\t...components: RestOrArray<\n\t\t\tActionRowBuilder | APIActionRowComponent\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component) =>\n\t\t\t\tcomponent instanceof ActionRowBuilder\n\t\t\t\t\t? component\n\t\t\t\t\t: new ActionRowBuilder(component),\n\t\t\t),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets components for this modal.\n\t *\n\t * @param components - The components to set\n\t */\n\tpublic setComponents(...components: RestOrArray>) {\n\t\tthis.components.splice(0, this.components.length, ...normalizeArray(components));\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIModalInteractionResponseCallbackData {\n\t\tvalidateRequiredParameters(this.data.custom_id, this.data.title, this.components);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t} as APIModalInteractionResponseCallbackData;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport {\n\tApplicationIntegrationType,\n\tInteractionContextType,\n\tLocale,\n\ttype APIApplicationCommandOptionChoice,\n\ttype LocalizationMap,\n} from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder.js';\nimport type { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands.js';\nimport type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase.js';\n\nconst namePredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(32)\n\t.regex(/^[\\p{Ll}\\p{Lm}\\p{Lo}\\p{N}\\p{sc=Devanagari}\\p{sc=Thai}_-]+$/u)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateName(name: unknown): asserts name is string {\n\tnamePredicate.parse(name);\n}\n\nconst descriptionPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(100)\n\t.setValidationEnabled(isValidationEnabled);\nconst localePredicate = s.nativeEnum(Locale);\n\nexport function validateDescription(description: unknown): asserts description is string {\n\tdescriptionPredicate.parse(description);\n}\n\nconst maxArrayLengthPredicate = s.unknown().array().lengthLessThanOrEqual(25).setValidationEnabled(isValidationEnabled);\nexport function validateLocale(locale: unknown) {\n\treturn localePredicate.parse(locale);\n}\n\nexport function validateMaxOptionsLength(options: unknown): asserts options is ToAPIApplicationCommandOptions[] {\n\tmaxArrayLengthPredicate.parse(options);\n}\n\nexport function validateRequiredParameters(\n\tname: string,\n\tdescription: string,\n\toptions: ToAPIApplicationCommandOptions[],\n) {\n\t// Assert name matches all conditions\n\tvalidateName(name);\n\n\t// Assert description conditions\n\tvalidateDescription(description);\n\n\t// Assert options conditions\n\tvalidateMaxOptionsLength(options);\n}\n\nconst booleanPredicate = s.boolean();\n\nexport function validateDefaultPermission(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport function validateRequired(required: unknown): asserts required is boolean {\n\tbooleanPredicate.parse(required);\n}\n\nconst choicesLengthPredicate = s.number().lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);\n\nexport function validateChoicesLength(amountAdding: number, choices?: APIApplicationCommandOptionChoice[]): void {\n\tchoicesLengthPredicate.parse((choices?.length ?? 0) + amountAdding);\n}\n\nexport function assertReturnOfBuilder<\n\tReturnType extends ApplicationCommandOptionBase | SlashCommandSubcommandBuilder | SlashCommandSubcommandGroupBuilder,\n>(input: unknown, ExpectedInstanceOf: new () => ReturnType): asserts input is ReturnType {\n\ts.instance(ExpectedInstanceOf).parse(input);\n}\n\nexport const localizationMapPredicate = s\n\t.object(Object.fromEntries(Object.values(Locale).map((locale) => [locale, s.string().nullish()])))\n\t.strict()\n\t.nullish()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateLocalizationMap(value: unknown): asserts value is LocalizationMap {\n\tlocalizationMapPredicate.parse(value);\n}\n\nconst dmPermissionPredicate = s.boolean().nullish();\n\nexport function validateDMPermission(value: unknown): asserts value is boolean | null | undefined {\n\tdmPermissionPredicate.parse(value);\n}\n\nconst memberPermissionPredicate = s\n\t.union([\n\t\ts.bigint().transform((value) => value.toString()),\n\t\ts\n\t\t\t.number()\n\t\t\t.safeInt()\n\t\t\t.transform((value) => value.toString()),\n\t\ts.string().regex(/^\\d+$/),\n\t])\n\t.nullish();\n\nexport function validateDefaultMemberPermissions(permissions: unknown) {\n\treturn memberPermissionPredicate.parse(permissions);\n}\n\nexport function validateNSFW(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport const contextsPredicate = s.array(\n\ts.nativeEnum(InteractionContextType).setValidationEnabled(isValidationEnabled),\n);\n\nexport const integrationTypesPredicate = s.array(\n\ts.nativeEnum(ApplicationIntegrationType).setValidationEnabled(isValidationEnabled),\n);\n","import type {\n\tAPIApplicationCommandOption,\n\tApplicationIntegrationType,\n\tInteractionContextType,\n\tLocalizationMap,\n\tPermissions,\n} from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription.js';\nimport { SharedSlashCommand } from './mixins/SharedSlashCommand.js';\nimport { SharedSlashCommandOptions } from './mixins/SharedSlashCommandOptions.js';\nimport { SharedSlashCommandSubcommands } from './mixins/SharedSubcommands.js';\n\n/**\n * A builder that creates API-compatible JSON data for slash commands.\n */\n@mix(SharedSlashCommandOptions, SharedNameAndDescription, SharedSlashCommandSubcommands, SharedSlashCommand)\nexport class SlashCommandBuilder {\n\t/**\n\t * The name of this command.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The name localizations of this command.\n\t */\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\t/**\n\t * The description of this command.\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The description localizations of this command.\n\t */\n\tpublic readonly description_localizations?: LocalizationMap;\n\n\t/**\n\t * The options of this command.\n\t */\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\t/**\n\t * The contexts for this command.\n\t */\n\tpublic readonly contexts?: InteractionContextType[];\n\n\t/**\n\t * Whether this command is enabled by default when the application is added to a guild.\n\t *\n\t * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.setDMPermission} instead.\n\t */\n\tpublic readonly default_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The set of permissions represented as a bit set for the command.\n\t */\n\tpublic readonly default_member_permissions: Permissions | null | undefined = undefined;\n\n\t/**\n\t * Indicates whether the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This property is only for global commands.\n\t * @deprecated\n\t * Use {@link SlashCommandBuilder.contexts} instead.\n\t */\n\tpublic readonly dm_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The integration types for this command.\n\t */\n\tpublic readonly integration_types?: ApplicationIntegrationType[];\n\n\t/**\n\t * Whether this command is NSFW.\n\t */\n\tpublic readonly nsfw: boolean | undefined = undefined;\n}\n\nexport interface SlashCommandBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandOptions,\n\t\tSharedSlashCommandSubcommands,\n\t\tSharedSlashCommand {}\n\n/**\n * An interface specifically for slash command subcommands.\n */\nexport interface SlashCommandSubcommandsOnlyBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandSubcommands,\n\t\tSharedSlashCommand {}\n\n/**\n * An interface specifically for slash command options.\n */\nexport interface SlashCommandOptionsOnlyBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandOptions,\n\t\tSharedSlashCommand {}\n\n/**\n * An interface that ensures the `toJSON()` call will return something\n * that can be serialized into API-compatible data.\n */\nexport interface ToAPIApplicationCommandOptions {\n\ttoJSON(): APIApplicationCommandOption;\n}\n","import type { LocaleString, LocalizationMap } from 'discord-api-types/v10';\nimport { validateDescription, validateLocale, validateName } from '../Assertions.js';\n\n/**\n * This mixin holds name and description symbols for slash commands.\n */\nexport class SharedNameAndDescription {\n\t/**\n\t * The name of this command.\n\t */\n\tpublic readonly name!: string;\n\n\t/**\n\t * The name localizations of this command.\n\t */\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\t/**\n\t * The description of this command.\n\t */\n\tpublic readonly description!: string;\n\n\t/**\n\t * The description localizations of this command.\n\t */\n\tpublic readonly description_localizations?: LocalizationMap;\n\n\t/**\n\t * Sets the name of this command.\n\t *\n\t * @param name - The name to use\n\t */\n\tpublic setName(name: string): this {\n\t\t// Assert the name matches the conditions\n\t\tvalidateName(name);\n\n\t\tReflect.set(this, 'name', name);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this command.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\t// Assert the description matches the conditions\n\t\tvalidateDescription(description);\n\n\t\tReflect.set(this, 'description', description);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a name localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedName - The localized name for the given `locale`\n\t */\n\tpublic setNameLocalization(locale: LocaleString, localizedName: string | null) {\n\t\tif (!this.name_localizations) {\n\t\t\tReflect.set(this, 'name_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedName === null) {\n\t\t\tthis.name_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateName(localizedName);\n\n\t\tthis.name_localizations![parsedLocale] = localizedName;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name localizations for this command.\n\t *\n\t * @param localizedNames - The object of localized names to set\n\t */\n\tpublic setNameLocalizations(localizedNames: LocalizationMap | null) {\n\t\tif (localizedNames === null) {\n\t\t\tReflect.set(this, 'name_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'name_localizations', {});\n\n\t\tfor (const args of Object.entries(localizedNames)) {\n\t\t\tthis.setNameLocalization(...(args as [LocaleString, string | null]));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a description localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedDescription - The localized description for the given locale\n\t */\n\tpublic setDescriptionLocalization(locale: LocaleString, localizedDescription: string | null) {\n\t\tif (!this.description_localizations) {\n\t\t\tReflect.set(this, 'description_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedDescription === null) {\n\t\t\tthis.description_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateDescription(localizedDescription);\n\n\t\tthis.description_localizations![parsedLocale] = localizedDescription;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description localizations for this command.\n\t *\n\t * @param localizedDescriptions - The object of localized descriptions to set\n\t */\n\tpublic setDescriptionLocalizations(localizedDescriptions: LocalizationMap | null) {\n\t\tif (localizedDescriptions === null) {\n\t\t\tReflect.set(this, 'description_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'description_localizations', {});\n\t\tfor (const args of Object.entries(localizedDescriptions)) {\n\t\t\tthis.setDescriptionLocalization(...(args as [LocaleString, string | null]));\n\t\t}\n\n\t\treturn this;\n\t}\n}\n","import {\n\tApplicationCommandType,\n\ttype ApplicationIntegrationType,\n\ttype InteractionContextType,\n\ttype LocalizationMap,\n\ttype Permissions,\n\ttype RESTPostAPIChatInputApplicationCommandsJSONBody,\n} from 'discord-api-types/v10';\nimport type { RestOrArray } from '../../../util/normalizeArray.js';\nimport { normalizeArray } from '../../../util/normalizeArray.js';\nimport {\n\tcontextsPredicate,\n\tintegrationTypesPredicate,\n\tvalidateDMPermission,\n\tvalidateDefaultMemberPermissions,\n\tvalidateDefaultPermission,\n\tvalidateLocalizationMap,\n\tvalidateNSFW,\n\tvalidateRequiredParameters,\n} from '../Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder.js';\n\n/**\n * This mixin holds symbols that can be shared in slashcommands independent of options or subcommands.\n */\nexport class SharedSlashCommand {\n\tpublic readonly name: string = undefined!;\n\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\tpublic readonly description: string = undefined!;\n\n\tpublic readonly description_localizations?: LocalizationMap;\n\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\tpublic readonly contexts?: InteractionContextType[];\n\n\t/**\n\t * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.setDMPermission} instead.\n\t */\n\tpublic readonly default_permission: boolean | undefined = undefined;\n\n\tpublic readonly default_member_permissions: Permissions | null | undefined = undefined;\n\n\t/**\n\t * @deprecated Use {@link SharedSlashCommand.contexts} instead.\n\t */\n\tpublic readonly dm_permission: boolean | undefined = undefined;\n\n\tpublic readonly integration_types?: ApplicationIntegrationType[];\n\n\tpublic readonly nsfw: boolean | undefined = undefined;\n\n\t/**\n\t * Sets the contexts of this command.\n\t *\n\t * @param contexts - The contexts\n\t */\n\tpublic setContexts(...contexts: RestOrArray) {\n\t\tReflect.set(this, 'contexts', contextsPredicate.parse(normalizeArray(contexts)));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the integration types of this command.\n\t *\n\t * @param integrationTypes - The integration types\n\t */\n\tpublic setIntegrationTypes(...integrationTypes: RestOrArray) {\n\t\tReflect.set(this, 'integration_types', integrationTypesPredicate.parse(normalizeArray(integrationTypes)));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether the command is enabled by default when the application is added to a guild.\n\t *\n\t * @remarks\n\t * If set to `false`, you will have to later `PUT` the permissions for this command.\n\t * @param value - Whether or not to enable this command by default\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.setDMPermission} instead.\n\t */\n\tpublic setDefaultPermission(value: boolean) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDefaultPermission(value);\n\n\t\tReflect.set(this, 'default_permission', value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the default permissions a member should have in order to run the command.\n\t *\n\t * @remarks\n\t * You can set this to `'0'` to disable the command by default.\n\t * @param permissions - The permissions bit field to set\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t */\n\tpublic setDefaultMemberPermissions(permissions: Permissions | bigint | number | null | undefined) {\n\t\t// Assert the value and parse it\n\t\tconst permissionValue = validateDefaultMemberPermissions(permissions);\n\n\t\tReflect.set(this, 'default_member_permissions', permissionValue);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets if the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This method is only for global commands.\n\t * @param enabled - Whether the command should be enabled in direct messages\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated\n\t * Use {@link SharedSlashCommand.setContexts} instead.\n\t */\n\tpublic setDMPermission(enabled: boolean | null | undefined) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDMPermission(enabled);\n\n\t\tReflect.set(this, 'dm_permission', enabled);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this command is NSFW.\n\t *\n\t * @param nsfw - Whether this command is NSFW\n\t */\n\tpublic setNSFW(nsfw = true) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateNSFW(nsfw);\n\t\tReflect.set(this, 'nsfw', nsfw);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): RESTPostAPIChatInputApplicationCommandsJSONBody {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\tvalidateLocalizationMap(this.name_localizations);\n\t\tvalidateLocalizationMap(this.description_localizations);\n\n\t\treturn {\n\t\t\t...this,\n\t\t\ttype: ApplicationCommandType.ChatInput,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandAttachmentOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command attachment option.\n */\nexport class SlashCommandAttachmentOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic override readonly type = ApplicationCommandOptionType.Attachment as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandAttachmentOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import type { APIApplicationCommandBasicOption, ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { validateRequiredParameters, validateRequired, validateLocalizationMap } from '../Assertions.js';\nimport { SharedNameAndDescription } from './NameAndDescription.js';\n\n/**\n * The base application command option builder that contains common symbols for application command builders.\n */\nexport abstract class ApplicationCommandOptionBase extends SharedNameAndDescription {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic abstract readonly type: ApplicationCommandOptionType;\n\n\t/**\n\t * Whether this option is required.\n\t *\n\t * @defaultValue `false`\n\t */\n\tpublic readonly required: boolean = false;\n\n\t/**\n\t * Sets whether this option is required.\n\t *\n\t * @param required - Whether this option should be required\n\t */\n\tpublic setRequired(required: boolean) {\n\t\t// Assert that you actually passed a boolean\n\t\tvalidateRequired(required);\n\n\t\tReflect.set(this, 'required', required);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\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(): APIApplicationCommandBasicOption;\n\n\t/**\n\t * This method runs required validators on this builder.\n\t */\n\tprotected runRequiredValidations() {\n\t\tvalidateRequiredParameters(this.name, this.description, []);\n\n\t\t// Validate localizations\n\t\tvalidateLocalizationMap(this.name_localizations);\n\t\tvalidateLocalizationMap(this.description_localizations);\n\n\t\t// Assert that you actually passed a boolean\n\t\tvalidateRequired(this.required);\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandBooleanOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command boolean option.\n */\nexport class SlashCommandBooleanOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Boolean as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandBooleanOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandChannelOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionChannelTypesMixin } from '../mixins/ApplicationCommandOptionChannelTypesMixin.js';\n\n/**\n * A slash command channel option.\n */\n@mix(ApplicationCommandOptionChannelTypesMixin)\nexport class SlashCommandChannelOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic override readonly type = ApplicationCommandOptionType.Channel as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandChannelOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandChannelOption extends ApplicationCommandOptionChannelTypesMixin {}\n","import { s } from '@sapphire/shapeshift';\nimport { ChannelType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../../util/normalizeArray';\n\n/**\n * The allowed channel types used for a channel option in a slash command builder.\n *\n * @privateRemarks This can't be dynamic because const enums are erased at runtime.\n * @internal\n */\nconst allowedChannelTypes = [\n\tChannelType.GuildText,\n\tChannelType.GuildVoice,\n\tChannelType.GuildCategory,\n\tChannelType.GuildAnnouncement,\n\tChannelType.AnnouncementThread,\n\tChannelType.PublicThread,\n\tChannelType.PrivateThread,\n\tChannelType.GuildStageVoice,\n\tChannelType.GuildForum,\n\tChannelType.GuildMedia,\n] as const;\n\n/**\n * The type of allowed channel types used for a channel option.\n */\nexport type ApplicationCommandOptionAllowedChannelTypes = (typeof allowedChannelTypes)[number];\n\nconst channelTypesPredicate = s.array(s.union(allowedChannelTypes.map((type) => s.literal(type))));\n\n/**\n * This mixin holds channel type symbols used for options.\n */\nexport class ApplicationCommandOptionChannelTypesMixin {\n\t/**\n\t * The channel types of this option.\n\t */\n\tpublic readonly channel_types?: ApplicationCommandOptionAllowedChannelTypes[];\n\n\t/**\n\t * Adds channel types to this option.\n\t *\n\t * @param channelTypes - The channel types\n\t */\n\tpublic addChannelTypes(...channelTypes: RestOrArray) {\n\t\tif (this.channel_types === undefined) {\n\t\t\tReflect.set(this, 'channel_types', []);\n\t\t}\n\n\t\tthis.channel_types!.push(...channelTypesPredicate.parse(normalizeArray(channelTypes)));\n\n\t\treturn this;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandIntegerOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\n\nconst numberValidator = s.number().int();\n\n/**\n * A slash command integer option.\n */\n@mix(\n\tApplicationCommandNumericOptionMinMaxValueMixin,\n\tApplicationCommandOptionWithAutocompleteMixin,\n\tApplicationCommandOptionWithChoicesMixin,\n)\nexport class SlashCommandIntegerOption\n\textends ApplicationCommandOptionBase\n\timplements ApplicationCommandNumericOptionMinMaxValueMixin\n{\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Integer as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}\n\t */\n\tpublic setMaxValue(max: number): this {\n\t\tnumberValidator.parse(max);\n\n\t\tReflect.set(this, 'max_value', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}\n\t */\n\tpublic setMinValue(min: number): this {\n\t\tnumberValidator.parse(min);\n\n\t\tReflect.set(this, 'min_value', min);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandIntegerOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this } as APIApplicationCommandIntegerOption;\n\t}\n}\n\nexport interface SlashCommandIntegerOption\n\textends ApplicationCommandNumericOptionMinMaxValueMixin,\n\t\tApplicationCommandOptionWithChoicesMixin,\n\t\tApplicationCommandOptionWithAutocompleteMixin {}\n","/**\n * This mixin holds minimum and maximum symbols used for options.\n */\nexport abstract class ApplicationCommandNumericOptionMinMaxValueMixin {\n\t/**\n\t * The maximum value of this option.\n\t */\n\tpublic readonly max_value?: number;\n\n\t/**\n\t * The minimum value of this option.\n\t */\n\tpublic readonly min_value?: number;\n\n\t/**\n\t * Sets the maximum number value of this option.\n\t *\n\t * @param max - The maximum value this option can be\n\t */\n\tpublic abstract setMaxValue(max: number): this;\n\n\t/**\n\t * Sets the minimum number value of this option.\n\t *\n\t * @param min - The minimum value this option can be\n\t */\n\tpublic abstract setMinValue(min: number): this;\n}\n","import { s } from '@sapphire/shapeshift';\nimport type { ApplicationCommandOptionType } from 'discord-api-types/v10';\n\nconst booleanPredicate = s.boolean();\n\n/**\n * This mixin holds choices and autocomplete symbols used for options.\n */\nexport class ApplicationCommandOptionWithAutocompleteMixin {\n\t/**\n\t * Whether this option utilizes autocomplete.\n\t */\n\tpublic readonly autocomplete?: boolean;\n\n\t/**\n\t * The type of this option.\n\t *\n\t * @privateRemarks Since this is present and this is a mixin, this is needed.\n\t */\n\tpublic readonly type!: ApplicationCommandOptionType;\n\n\t/**\n\t * Whether this option uses autocomplete.\n\t *\n\t * @param autocomplete - Whether this option should use autocomplete\n\t */\n\tpublic setAutocomplete(autocomplete: boolean): this {\n\t\t// Assert that you actually passed a boolean\n\t\tbooleanPredicate.parse(autocomplete);\n\n\t\tif (autocomplete && 'choices' in this && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tReflect.set(this, 'autocomplete', autocomplete);\n\n\t\treturn this;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandOptionChoice } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../../util/normalizeArray.js';\nimport { localizationMapPredicate, validateChoicesLength } from '../Assertions.js';\n\nconst stringPredicate = s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100);\nconst numberPredicate = s.number().greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY);\nconst choicesPredicate = s\n\t.object({\n\t\tname: stringPredicate,\n\t\tname_localizations: localizationMapPredicate,\n\t\tvalue: s.union([stringPredicate, numberPredicate]),\n\t})\n\t.array();\n\n/**\n * This mixin holds choices and autocomplete symbols used for options.\n */\nexport class ApplicationCommandOptionWithChoicesMixin {\n\t/**\n\t * The choices of this option.\n\t */\n\tpublic readonly choices?: APIApplicationCommandOptionChoice[];\n\n\t/**\n\t * The type of this option.\n\t *\n\t * @privateRemarks Since this is present and this is a mixin, this is needed.\n\t */\n\tpublic readonly type!: ApplicationCommandOptionType;\n\n\t/**\n\t * Adds multiple choices to this option.\n\t *\n\t * @param choices - The choices to add\n\t */\n\tpublic addChoices(...choices: RestOrArray>): this {\n\t\tconst normalizedChoices = normalizeArray(choices);\n\t\tif (normalizedChoices.length > 0 && 'autocomplete' in this && this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tchoicesPredicate.parse(normalizedChoices);\n\n\t\tif (this.choices === undefined) {\n\t\t\tReflect.set(this, 'choices', []);\n\t\t}\n\n\t\tvalidateChoicesLength(normalizedChoices.length, this.choices);\n\n\t\tfor (const { name, name_localizations, value } of normalizedChoices) {\n\t\t\t// Validate the value\n\t\t\tif (this.type === ApplicationCommandOptionType.String) {\n\t\t\t\tstringPredicate.parse(value);\n\t\t\t} else {\n\t\t\t\tnumberPredicate.parse(value);\n\t\t\t}\n\n\t\t\tthis.choices!.push({ name, name_localizations, value });\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets multiple choices for this option.\n\t *\n\t * @param choices - The choices to set\n\t */\n\tpublic setChoices>(...choices: RestOrArray): this {\n\t\tconst normalizedChoices = normalizeArray(choices);\n\t\tif (normalizedChoices.length > 0 && 'autocomplete' in this && this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tchoicesPredicate.parse(normalizedChoices);\n\n\t\tReflect.set(this, 'choices', []);\n\t\tthis.addChoices(normalizedChoices);\n\n\t\treturn this;\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandMentionableOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command mentionable option.\n */\nexport class SlashCommandMentionableOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Mentionable as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandMentionableOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandNumberOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\n\nconst numberValidator = s.number();\n\n/**\n * A slash command number option.\n */\n@mix(\n\tApplicationCommandNumericOptionMinMaxValueMixin,\n\tApplicationCommandOptionWithAutocompleteMixin,\n\tApplicationCommandOptionWithChoicesMixin,\n)\nexport class SlashCommandNumberOption\n\textends ApplicationCommandOptionBase\n\timplements ApplicationCommandNumericOptionMinMaxValueMixin\n{\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Number as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}\n\t */\n\tpublic setMaxValue(max: number): this {\n\t\tnumberValidator.parse(max);\n\n\t\tReflect.set(this, 'max_value', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}\n\t */\n\tpublic setMinValue(min: number): this {\n\t\tnumberValidator.parse(min);\n\n\t\tReflect.set(this, 'min_value', min);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandNumberOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this } as APIApplicationCommandNumberOption;\n\t}\n}\n\nexport interface SlashCommandNumberOption\n\textends ApplicationCommandNumericOptionMinMaxValueMixin,\n\t\tApplicationCommandOptionWithChoicesMixin,\n\t\tApplicationCommandOptionWithAutocompleteMixin {}\n","import { ApplicationCommandOptionType, type APIApplicationCommandRoleOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command role option.\n */\nexport class SlashCommandRoleOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic override readonly type = ApplicationCommandOptionType.Role as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandRoleOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandStringOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\n\nconst minLengthValidator = s.number().greaterThanOrEqual(0).lessThanOrEqual(6_000);\nconst maxLengthValidator = s.number().greaterThanOrEqual(1).lessThanOrEqual(6_000);\n\n/**\n * A slash command string option.\n */\n@mix(ApplicationCommandOptionWithAutocompleteMixin, ApplicationCommandOptionWithChoicesMixin)\nexport class SlashCommandStringOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.String as const;\n\n\t/**\n\t * The maximum length of this option.\n\t */\n\tpublic readonly max_length?: number;\n\n\t/**\n\t * The minimum length of this option.\n\t */\n\tpublic readonly min_length?: number;\n\n\t/**\n\t * Sets the maximum length of this string option.\n\t *\n\t * @param max - The maximum length this option can be\n\t */\n\tpublic setMaxLength(max: number): this {\n\t\tmaxLengthValidator.parse(max);\n\n\t\tReflect.set(this, 'max_length', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum length of this string option.\n\t *\n\t * @param min - The minimum length this option can be\n\t */\n\tpublic setMinLength(min: number): this {\n\t\tminLengthValidator.parse(min);\n\n\t\tReflect.set(this, 'min_length', min);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandStringOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this } as APIApplicationCommandStringOption;\n\t}\n}\n\nexport interface SlashCommandStringOption\n\textends ApplicationCommandOptionWithChoicesMixin,\n\t\tApplicationCommandOptionWithAutocompleteMixin {}\n","import { ApplicationCommandOptionType, type APIApplicationCommandUserOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command user option.\n */\nexport class SlashCommandUserOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.User as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandUserOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { assertReturnOfBuilder, validateMaxOptionsLength } from '../Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder';\nimport { SlashCommandAttachmentOption } from '../options/attachment.js';\nimport { SlashCommandBooleanOption } from '../options/boolean.js';\nimport { SlashCommandChannelOption } from '../options/channel.js';\nimport { SlashCommandIntegerOption } from '../options/integer.js';\nimport { SlashCommandMentionableOption } from '../options/mentionable.js';\nimport { SlashCommandNumberOption } from '../options/number.js';\nimport { SlashCommandRoleOption } from '../options/role.js';\nimport { SlashCommandStringOption } from '../options/string.js';\nimport { SlashCommandUserOption } from '../options/user.js';\nimport type { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * This mixin holds symbols that can be shared in slash command options.\n *\n * @typeParam TypeAfterAddingOptions - The type this class should return after adding an option.\n */\nexport class SharedSlashCommandOptions<\n\tTypeAfterAddingOptions extends SharedSlashCommandOptions,\n> {\n\tpublic readonly options!: ToAPIApplicationCommandOptions[];\n\n\t/**\n\t * Adds a boolean option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addBooleanOption(\n\t\tinput: SlashCommandBooleanOption | ((builder: SlashCommandBooleanOption) => SlashCommandBooleanOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandBooleanOption);\n\t}\n\n\t/**\n\t * Adds a user option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addUserOption(input: SlashCommandUserOption | ((builder: SlashCommandUserOption) => SlashCommandUserOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandUserOption);\n\t}\n\n\t/**\n\t * Adds a channel option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addChannelOption(\n\t\tinput: SlashCommandChannelOption | ((builder: SlashCommandChannelOption) => SlashCommandChannelOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandChannelOption);\n\t}\n\n\t/**\n\t * Adds a role option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addRoleOption(input: SlashCommandRoleOption | ((builder: SlashCommandRoleOption) => SlashCommandRoleOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandRoleOption);\n\t}\n\n\t/**\n\t * Adds an attachment option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addAttachmentOption(\n\t\tinput: SlashCommandAttachmentOption | ((builder: SlashCommandAttachmentOption) => SlashCommandAttachmentOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandAttachmentOption);\n\t}\n\n\t/**\n\t * Adds a mentionable option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addMentionableOption(\n\t\tinput: SlashCommandMentionableOption | ((builder: SlashCommandMentionableOption) => SlashCommandMentionableOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandMentionableOption);\n\t}\n\n\t/**\n\t * Adds a string option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addStringOption(\n\t\tinput: SlashCommandStringOption | ((builder: SlashCommandStringOption) => SlashCommandStringOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandStringOption);\n\t}\n\n\t/**\n\t * Adds an integer option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addIntegerOption(\n\t\tinput: SlashCommandIntegerOption | ((builder: SlashCommandIntegerOption) => SlashCommandIntegerOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandIntegerOption);\n\t}\n\n\t/**\n\t * Adds a number option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addNumberOption(\n\t\tinput: SlashCommandNumberOption | ((builder: SlashCommandNumberOption) => SlashCommandNumberOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandNumberOption);\n\t}\n\n\t/**\n\t * Where the actual adding magic happens. ✨\n\t *\n\t * @param input - The input. What else?\n\t * @param Instance - The instance of whatever is being added\n\t * @internal\n\t */\n\tprivate _sharedAddOptionMethod(\n\t\tinput: OptionBuilder | ((builder: OptionBuilder) => OptionBuilder),\n\t\tInstance: new () => OptionBuilder,\n\t): TypeAfterAddingOptions {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new Instance()) : input;\n\n\t\tassertReturnOfBuilder(result, Instance);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this as unknown as TypeAfterAddingOptions;\n\t}\n}\n","import {\n\tApplicationCommandOptionType,\n\ttype APIApplicationCommandSubcommandGroupOption,\n\ttype APIApplicationCommandSubcommandOption,\n} from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { assertReturnOfBuilder, validateMaxOptionsLength, validateRequiredParameters } from './Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder.js';\nimport type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase.js';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription.js';\nimport { SharedSlashCommandOptions } from './mixins/SharedSlashCommandOptions.js';\n\n/**\n * Represents a folder for subcommands.\n *\n * @see {@link https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups}\n */\n@mix(SharedNameAndDescription)\nexport class SlashCommandSubcommandGroupBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand group.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand group.\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The subcommands within this subcommand group.\n\t */\n\tpublic readonly options: SlashCommandSubcommandBuilder[] = [];\n\n\t/**\n\t * Adds a new subcommand to this group.\n\t *\n\t * @param input - A function that returns a subcommand builder or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t) {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIApplicationCommandSubcommandGroupOption {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.SubcommandGroup,\n\t\t\tname: this.name,\n\t\t\tname_localizations: this.name_localizations,\n\t\t\tdescription: this.description,\n\t\t\tdescription_localizations: this.description_localizations,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandGroupBuilder extends SharedNameAndDescription {}\n\n/**\n * A builder that creates API-compatible JSON data for slash command subcommands.\n *\n * @see {@link https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups}\n */\n@mix(SharedNameAndDescription, SharedSlashCommandOptions)\nexport class SlashCommandSubcommandBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand.\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The options within this subcommand.\n\t */\n\tpublic readonly options: ApplicationCommandOptionBase[] = [];\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIApplicationCommandSubcommandOption {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.Subcommand,\n\t\t\tname: this.name,\n\t\t\tname_localizations: this.name_localizations,\n\t\t\tdescription: this.description,\n\t\t\tdescription_localizations: this.description_localizations,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandOptions {}\n","import { assertReturnOfBuilder, validateMaxOptionsLength } from '../Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder.js';\nimport { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from '../SlashCommandSubcommands.js';\n\n/**\n * This mixin holds symbols that can be shared in slash subcommands.\n *\n * @typeParam TypeAfterAddingSubcommands - The type this class should return after adding a subcommand or subcommand group.\n */\nexport class SharedSlashCommandSubcommands<\n\tTypeAfterAddingSubcommands extends SharedSlashCommandSubcommands,\n> {\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\t/**\n\t * Adds a new subcommand group to this command.\n\t *\n\t * @param input - A function that returns a subcommand group builder or an already built builder\n\t */\n\tpublic addSubcommandGroup(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandGroupBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandGroupBuilder) => SlashCommandSubcommandGroupBuilder),\n\t): TypeAfterAddingSubcommands {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandGroupBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandGroupBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this as unknown as TypeAfterAddingSubcommands;\n\t}\n\n\t/**\n\t * Adds a new subcommand to this command.\n\t *\n\t * @param input - A function that returns a subcommand builder or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t): TypeAfterAddingSubcommands {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this as unknown as TypeAfterAddingSubcommands;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandType, ApplicationIntegrationType, InteractionContextType } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport type { ContextMenuCommandType } from './ContextMenuCommandBuilder.js';\n\nconst namePredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(32)\n\t.regex(/\\S/)\n\t.setValidationEnabled(isValidationEnabled);\nconst typePredicate = s\n\t.union([s.literal(ApplicationCommandType.User), s.literal(ApplicationCommandType.Message)])\n\t.setValidationEnabled(isValidationEnabled);\nconst booleanPredicate = s.boolean();\n\nexport function validateDefaultPermission(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport function validateName(name: unknown): asserts name is string {\n\tnamePredicate.parse(name);\n}\n\nexport function validateType(type: unknown): asserts type is ContextMenuCommandType {\n\ttypePredicate.parse(type);\n}\n\nexport function validateRequiredParameters(name: string, type: number) {\n\t// Assert name matches all conditions\n\tvalidateName(name);\n\n\t// Assert type is valid\n\tvalidateType(type);\n}\n\nconst dmPermissionPredicate = s.boolean().nullish();\n\nexport function validateDMPermission(value: unknown): asserts value is boolean | null | undefined {\n\tdmPermissionPredicate.parse(value);\n}\n\nconst memberPermissionPredicate = s\n\t.union([\n\t\ts.bigint().transform((value) => value.toString()),\n\t\ts\n\t\t\t.number()\n\t\t\t.safeInt()\n\t\t\t.transform((value) => value.toString()),\n\t\ts.string().regex(/^\\d+$/),\n\t])\n\t.nullish();\n\nexport function validateDefaultMemberPermissions(permissions: unknown) {\n\treturn memberPermissionPredicate.parse(permissions);\n}\n\nexport const contextsPredicate = s.array(\n\ts.nativeEnum(InteractionContextType).setValidationEnabled(isValidationEnabled),\n);\n\nexport const integrationTypesPredicate = s.array(\n\ts.nativeEnum(ApplicationIntegrationType).setValidationEnabled(isValidationEnabled),\n);\n","import type {\n\tApplicationCommandType,\n\tApplicationIntegrationType,\n\tInteractionContextType,\n\tLocaleString,\n\tLocalizationMap,\n\tPermissions,\n\tRESTPostAPIContextMenuApplicationCommandsJSONBody,\n} from 'discord-api-types/v10';\nimport type { RestOrArray } from '../../util/normalizeArray.js';\nimport { normalizeArray } from '../../util/normalizeArray.js';\nimport { validateLocale, validateLocalizationMap } from '../slashCommands/Assertions.js';\nimport {\n\tvalidateRequiredParameters,\n\tvalidateName,\n\tvalidateType,\n\tvalidateDefaultPermission,\n\tvalidateDefaultMemberPermissions,\n\tvalidateDMPermission,\n\tcontextsPredicate,\n\tintegrationTypesPredicate,\n} from './Assertions.js';\n\n/**\n * The type a context menu command can be.\n */\nexport type ContextMenuCommandType = ApplicationCommandType.Message | ApplicationCommandType.User;\n\n/**\n * A builder that creates API-compatible JSON data for context menu commands.\n */\nexport class ContextMenuCommandBuilder {\n\t/**\n\t * The name of this command.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The name localizations of this command.\n\t */\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\t/**\n\t * The type of this command.\n\t */\n\tpublic readonly type: ContextMenuCommandType = undefined!;\n\n\t/**\n\t * The contexts for this command.\n\t */\n\tpublic readonly contexts?: InteractionContextType[];\n\n\t/**\n\t * Whether this command is enabled by default when the application is added to a guild.\n\t *\n\t * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.\n\t */\n\tpublic readonly default_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The set of permissions represented as a bit set for the command.\n\t */\n\tpublic readonly default_member_permissions: Permissions | null | undefined = undefined;\n\n\t/**\n\t * Indicates whether the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This property is only for global commands.\n\t * @deprecated\n\t * Use {@link ContextMenuCommandBuilder.contexts} instead.\n\t */\n\tpublic readonly dm_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The integration types for this command.\n\t */\n\tpublic readonly integration_types?: ApplicationIntegrationType[];\n\n\t/**\n\t * Sets the contexts of this command.\n\t *\n\t * @param contexts - The contexts\n\t */\n\tpublic setContexts(...contexts: RestOrArray) {\n\t\tReflect.set(this, 'contexts', contextsPredicate.parse(normalizeArray(contexts)));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets integration types of this command.\n\t *\n\t * @param integrationTypes - The integration types\n\t */\n\tpublic setIntegrationTypes(...integrationTypes: RestOrArray) {\n\t\tReflect.set(this, 'integration_types', integrationTypesPredicate.parse(normalizeArray(integrationTypes)));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name of this command.\n\t *\n\t * @param name - The name to use\n\t */\n\tpublic setName(name: string) {\n\t\t// Assert the name matches the conditions\n\t\tvalidateName(name);\n\n\t\tReflect.set(this, 'name', name);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the type of this command.\n\t *\n\t * @param type - The type to use\n\t */\n\tpublic setType(type: ContextMenuCommandType) {\n\t\t// Assert the type is valid\n\t\tvalidateType(type);\n\n\t\tReflect.set(this, 'type', type);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether the command is enabled by default when the application is added to a guild.\n\t *\n\t * @remarks\n\t * If set to `false`, you will have to later `PUT` the permissions for this command.\n\t * @param value - Whether to enable this command by default\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.\n\t */\n\tpublic setDefaultPermission(value: boolean) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDefaultPermission(value);\n\n\t\tReflect.set(this, 'default_permission', value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the default permissions a member should have in order to run this command.\n\t *\n\t * @remarks\n\t * You can set this to `'0'` to disable the command by default.\n\t * @param permissions - The permissions bit field to set\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t */\n\tpublic setDefaultMemberPermissions(permissions: Permissions | bigint | number | null | undefined) {\n\t\t// Assert the value and parse it\n\t\tconst permissionValue = validateDefaultMemberPermissions(permissions);\n\n\t\tReflect.set(this, 'default_member_permissions', permissionValue);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets if the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This method is only for global commands.\n\t * @param enabled - Whether the command should be enabled in direct messages\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated Use {@link ContextMenuCommandBuilder.setContexts} instead.\n\t */\n\tpublic setDMPermission(enabled: boolean | null | undefined) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDMPermission(enabled);\n\n\t\tReflect.set(this, 'dm_permission', enabled);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a name localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedName - The localized name for the given `locale`\n\t */\n\tpublic setNameLocalization(locale: LocaleString, localizedName: string | null) {\n\t\tif (!this.name_localizations) {\n\t\t\tReflect.set(this, 'name_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedName === null) {\n\t\t\tthis.name_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateName(localizedName);\n\n\t\tthis.name_localizations![parsedLocale] = localizedName;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name localizations for this command.\n\t *\n\t * @param localizedNames - The object of localized names to set\n\t */\n\tpublic setNameLocalizations(localizedNames: LocalizationMap | null) {\n\t\tif (localizedNames === null) {\n\t\t\tReflect.set(this, 'name_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'name_localizations', {});\n\n\t\tfor (const args of Object.entries(localizedNames))\n\t\t\tthis.setNameLocalization(...(args as [LocaleString, string | null]));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): RESTPostAPIContextMenuApplicationCommandsJSONBody {\n\t\tvalidateRequiredParameters(this.name, this.type);\n\n\t\tvalidateLocalizationMap(this.name_localizations);\n\n\t\treturn { ...this };\n\t}\n}\n","import type { APIEmbed } from 'discord-api-types/v10';\n\n/**\n * Calculates the length of the embed.\n *\n * @param data - The embed data to check\n */\nexport function embedLength(data: APIEmbed) {\n\treturn (\n\t\t(data.title?.length ?? 0) +\n\t\t(data.description?.length ?? 0) +\n\t\t(data.fields?.reduce((prev, curr) => prev + curr.name.length + curr.value.length, 0) ?? 0) +\n\t\t(data.footer?.text.length ?? 0) +\n\t\t(data.author?.name.length ?? 0)\n\t);\n}\n"],"mappings":"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","names":["Assertions_exports","Assertions_exports","import_shapeshift","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","Assertions_exports","placeholderValidator","import_shapeshift","import_v10","placeholderValidator","placeholderValidator","isEqual","import_v10","Assertions_exports","descriptionPredicate","import_shapeshift","import_v10","import_v10","descriptionPredicate","descriptionPredicate","import_v10","import_v10","import_v10","import_v10","descriptionPredicate","import_v10","Assertions_exports","validateRequiredParameters","import_shapeshift","validateRequiredParameters","validateRequiredParameters","Assertions_exports","assertReturnOfBuilder","validateRequiredParameters","import_shapeshift","import_v10","descriptionPredicate","validateRequiredParameters","assertReturnOfBuilder","import_ts_mixer","import_v10","validateRequiredParameters","import_v10","validateRequiredParameters","import_v10","import_v10","import_shapeshift","import_v10","import_shapeshift","import_v10","import_ts_mixer","import_shapeshift","booleanPredicate","import_shapeshift","import_v10","import_v10","import_shapeshift","import_v10","import_ts_mixer","numberValidator","import_v10","import_shapeshift","import_v10","import_ts_mixer","minLengthValidator","maxLengthValidator","import_v10","assertReturnOfBuilder","import_v10","import_ts_mixer","assertReturnOfBuilder","validateRequiredParameters","assertReturnOfBuilder","Assertions_exports","contextsPredicate","integrationTypesPredicate","validateDMPermission","validateDefaultMemberPermissions","validateDefaultPermission","validateName","validateRequiredParameters","import_shapeshift","import_v10","namePredicate","booleanPredicate","validateDefaultPermission","validateName","validateRequiredParameters","dmPermissionPredicate","validateDMPermission","memberPermissionPredicate","validateDefaultMemberPermissions","contextsPredicate","integrationTypesPredicate","contextsPredicate","integrationTypesPredicate","validateName","validateDefaultPermission","validateDefaultMemberPermissions","validateDMPermission","validateRequiredParameters"]} \ No newline at end of file +{"version":3,"sources":["../src/index.ts","../src/messages/embed/Assertions.ts","../src/util/validation.ts","../src/util/normalizeArray.ts","../src/messages/embed/Embed.ts","../src/components/Assertions.ts","../src/components/selectMenu/StringSelectMenuOption.ts","../src/components/ActionRow.ts","../src/components/Component.ts","../src/components/Components.ts","../src/components/button/Button.ts","../src/components/fileUpload/FileUpload.ts","../src/components/fileUpload/Assertions.ts","../src/components/label/Label.ts","../src/components/selectMenu/ChannelSelectMenu.ts","../src/components/textInput/Assertions.ts","../src/components/selectMenu/BaseSelectMenu.ts","../src/components/selectMenu/MentionableSelectMenu.ts","../src/components/selectMenu/RoleSelectMenu.ts","../src/components/selectMenu/StringSelectMenu.ts","../src/components/selectMenu/Assertions.ts","../src/components/selectMenu/UserSelectMenu.ts","../src/components/textInput/TextInput.ts","../src/components/label/Assertions.ts","../src/components/v2/Container.ts","../src/components/v2/Assertions.ts","../src/components/v2/Thumbnail.ts","../src/components/v2/File.ts","../src/components/v2/Separator.ts","../src/components/v2/TextDisplay.ts","../src/components/v2/MediaGallery.ts","../src/components/v2/MediaGalleryItem.ts","../src/components/v2/Section.ts","../src/interactions/modals/Modal.ts","../src/interactions/modals/Assertions.ts","../src/interactions/slashCommands/Assertions.ts","../src/interactions/slashCommands/SlashCommandBuilder.ts","../src/interactions/slashCommands/mixins/NameAndDescription.ts","../src/interactions/slashCommands/mixins/SharedSlashCommand.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/ApplicationCommandOptionWithAutocompleteMixin.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesMixin.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/slashCommands/SlashCommandSubcommands.ts","../src/interactions/slashCommands/mixins/SharedSubcommands.ts","../src/interactions/contextMenuCommands/Assertions.ts","../src/interactions/contextMenuCommands/ContextMenuCommandBuilder.ts","../src/util/componentUtil.ts"],"sourcesContent":["export * as EmbedAssertions from './messages/embed/Assertions.js';\nexport * from './messages/embed/Embed.js';\n// TODO: Consider removing this dep in the next major version\nexport * from '@discordjs/formatters';\n\nexport * as ComponentAssertions from './components/Assertions.js';\nexport * from './components/ActionRow.js';\nexport * from './components/button/Button.js';\nexport * from './components/Component.js';\nexport * from './components/Components.js';\nexport * from './components/textInput/TextInput.js';\nexport * as TextInputAssertions from './components/textInput/Assertions.js';\nexport * from './interactions/modals/Modal.js';\nexport * as ModalAssertions from './interactions/modals/Assertions.js';\n\nexport * from './components/selectMenu/BaseSelectMenu.js';\nexport * from './components/selectMenu/ChannelSelectMenu.js';\nexport * from './components/selectMenu/MentionableSelectMenu.js';\nexport * from './components/selectMenu/RoleSelectMenu.js';\nexport * from './components/selectMenu/StringSelectMenu.js';\n// TODO: Remove those aliases in v2\nexport {\n\t/**\n\t * @deprecated Will be removed in the next major version, use {@link StringSelectMenuBuilder} instead.\n\t */\n\tStringSelectMenuBuilder as SelectMenuBuilder,\n} from './components/selectMenu/StringSelectMenu.js';\nexport {\n\t/**\n\t * @deprecated Will be removed in the next major version, use {@link StringSelectMenuOptionBuilder} instead.\n\t */\n\tStringSelectMenuOptionBuilder as SelectMenuOptionBuilder,\n} from './components/selectMenu/StringSelectMenuOption.js';\nexport * as SelectMenuAssertions from './components/selectMenu/Assertions.js';\nexport * from './components/selectMenu/StringSelectMenuOption.js';\nexport * from './components/selectMenu/UserSelectMenu.js';\n\nexport * from './components/fileUpload/FileUpload.js';\nexport * as FileUploadAssertions from './components/fileUpload/Assertions.js';\n\nexport * from './components/label/Label.js';\nexport * as LabelAssertions from './components/label/Assertions.js';\n\nexport * as ComponentsV2Assertions from './components/v2/Assertions.js';\nexport * from './components/v2/Container.js';\nexport * from './components/v2/File.js';\nexport * from './components/v2/MediaGallery.js';\nexport * from './components/v2/MediaGalleryItem.js';\nexport * from './components/v2/Section.js';\nexport * from './components/v2/Separator.js';\nexport * from './components/v2/TextDisplay.js';\nexport * from './components/v2/Thumbnail.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/ApplicationCommandOptionWithAutocompleteMixin.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesMixin.js';\nexport * from './interactions/slashCommands/mixins/NameAndDescription.js';\nexport * from './interactions/slashCommands/mixins/SharedSlashCommandOptions.js';\nexport * from './interactions/slashCommands/mixins/SharedSubcommands.js';\nexport * from './interactions/slashCommands/mixins/SharedSlashCommand.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';\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 * @privateRemarks This needs to explicitly be `string` so it is not typed as a \"const string\" that gets injected by esbuild.\n */\nexport const version = '1.13.1' as string;\n","import { s } from '@sapphire/shapeshift';\nimport type { APIEmbedField } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\n\nexport const fieldNamePredicate = s.string().lengthLessThanOrEqual(256).setValidationEnabled(isValidationEnabled);\n\nexport const fieldValuePredicate = s.string().lengthLessThanOrEqual(1_024).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\n\t.lengthGreaterThanOrEqual(1)\n\t.nullable()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const imageURLPredicate = s\n\t.string()\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:', 'attachment:'],\n\t})\n\t.nullish()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const urlPredicate = s\n\t.string()\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:'],\n\t})\n\t.nullish()\n\t.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\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(255)\n\t.setValidationEnabled(isValidationEnabled);\nexport const colorPredicate = s\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(0xffffff)\n\t.or(s.tuple([RGBPredicate, RGBPredicate, RGBPredicate]))\n\t.nullable()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const descriptionPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(4_096)\n\t.nullable()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const footerTextPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(2_048)\n\t.nullable()\n\t.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\n\t.lengthGreaterThanOrEqual(1)\n\t.nullable()\n\t.setValidationEnabled(isValidationEnabled);\n","let validate = true;\n\n/**\n * Enables validators.\n *\n * @returns Whether validation is occurring.\n */\nexport function enableValidators() {\n\treturn (validate = true);\n}\n\n/**\n * Disables validators.\n *\n * @returns Whether validation is occurring.\n */\nexport function disableValidators() {\n\treturn (validate = false);\n}\n\n/**\n * Checks whether validation is occurring.\n */\nexport function isValidationEnabled() {\n\treturn validate;\n}\n","/**\n * Normalizes data that is a rest parameter or an array into an array with a depth of 1.\n *\n * @typeParam ItemType - The data that must satisfy {@link RestOrArray}.\n * @param arr - The (possibly variadic) data to normalize\n */\nexport function normalizeArray(arr: RestOrArray): ItemType[] {\n\tif (Array.isArray(arr[0])) return [...arr[0]];\n\treturn arr as ItemType[];\n}\n\n/**\n * Represents data that may be an array or came from a rest parameter.\n *\n * @remarks\n * This type is used throughout builders to ensure both an array and variadic arguments\n * may be used. It is normalized with {@link normalizeArray}.\n */\nexport type RestOrArray = Type[] | [Type[]];\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\n/**\n * A tuple satisfying the RGB color model.\n *\n * @see {@link https://developer.mozilla.org/docs/Glossary/RGB}\n */\nexport type RGBTuple = [red: number, green: number, blue: number];\n\n/**\n * The base icon data typically used in payloads.\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\n/**\n * Represents the author data of an embed.\n */\nexport interface EmbedAuthorData extends IconData, Omit {}\n\n/**\n * Represents the author options of an embed.\n */\nexport interface EmbedAuthorOptions extends Omit {}\n\n/**\n * Represents the footer data of an embed.\n */\nexport interface EmbedFooterData extends IconData, Omit {}\n\n/**\n * Represents the footer options of an embed.\n */\nexport interface EmbedFooterOptions extends Omit {}\n\n/**\n * Represents the image data of an embed.\n */\nexport interface EmbedImageData extends Omit {\n\t/**\n\t * The proxy URL for the image.\n\t */\n\tproxyURL?: string;\n}\n\n/**\n * A builder that creates API-compatible JSON data for embeds.\n */\nexport class EmbedBuilder {\n\t/**\n\t * The API data associated with this embed.\n\t */\n\tpublic readonly data: APIEmbed;\n\n\t/**\n\t * Creates a new embed from API data.\n\t *\n\t * @param data - The API data to create this embed with\n\t */\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\tconst normalizedFields = normalizeArray(fields);\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(normalizedFields.length, this.data.fields);\n\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(normalizedFields);\n\n\t\tif (this.data.fields) this.data.fields.push(...normalizedFields);\n\t\telse this.data.fields = normalizedFields;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts fields for this embed.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t * The maximum amount of fields that can be added is 25.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing fields of an embed.\n\t * @example\n\t * Remove the first field:\n\t * ```ts\n\t * embed.spliceFields(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n fields:\n\t * ```ts\n\t * const n = 4;\n\t * embed.spliceFields(0, n);\n\t * ```\n\t * @example\n\t * Remove the last field:\n\t * ```ts\n\t * embed.spliceFields(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of fields to remove\n\t * @param fields - The replacing field objects\n\t */\n\tpublic spliceFields(index: number, deleteCount: number, ...fields: APIEmbedField[]): this {\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(fields.length - deleteCount, this.data.fields);\n\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(fields);\n\t\tif (this.data.fields) this.data.fields.splice(index, deleteCount, ...fields);\n\t\telse this.data.fields = fields;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the fields for this embed.\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): this {\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 to use\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 to use\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 to use\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 footer to use\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 image URL to use\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 thumbnail URL to use\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 to use\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 for this embed.\n\t *\n\t * @param title - The title to use\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 to use\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 * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIEmbed {\n\t\treturn { ...this.data };\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ButtonStyle, ChannelType, type APIMessageComponentEmoji } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../util/validation.js';\nimport { StringSelectMenuOptionBuilder } from './selectMenu/StringSelectMenuOption.js';\n\nexport const idValidator = s\n\t.number()\n\t.safeInt()\n\t.greaterThanOrEqual(1)\n\t.lessThan(4_294_967_296) // 2^32 - 1\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const customIdValidator = s\n\t.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()\n\t.strict()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const disabledValidator = s.boolean();\n\nexport const buttonLabelValidator = s\n\t.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\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(25)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const labelValueDescriptionValidator = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(100)\n\t.setValidationEnabled(isValidationEnabled);\n\n/**\n * @deprecated Replaced with selectMenuStringOptionPredicate.\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\n\t.array()\n\t.lengthGreaterThanOrEqual(0)\n\t.setValidationEnabled(isValidationEnabled);\nexport const optionsLengthValidator = s\n\t.number()\n\t.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\n\t.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\tskuId?: string,\n\turl?: string,\n) {\n\tif (style === ButtonStyle.Premium) {\n\t\tif (!skuId) {\n\t\t\tthrow new RangeError('Premium buttons must have an SKU id.');\n\t\t}\n\n\t\tif (customId || label || url || emoji) {\n\t\t\tthrow new RangeError('Premium buttons cannot have a custom id, label, URL, or emoji.');\n\t\t}\n\t} else {\n\t\tif (skuId) {\n\t\t\tthrow new RangeError('Non-premium buttons must not have an SKU id.');\n\t\t}\n\n\t\tif (url && customId) {\n\t\t\tthrow new RangeError('URL and custom id are mutually exclusive.');\n\t\t}\n\n\t\tif (!label && !emoji) {\n\t\t\tthrow new RangeError('Non-premium buttons must have a label and/or an emoji.');\n\t\t}\n\n\t\tif (style === ButtonStyle.Link) {\n\t\t\tif (!url) {\n\t\t\t\tthrow new RangeError('Link buttons must have a URL.');\n\t\t\t}\n\t\t} else if (url) {\n\t\t\tthrow new RangeError('Non-premium and non-link buttons cannot have a URL.');\n\t\t}\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 * A builder that creates API-compatible JSON data for string select menu options.\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 for this option.\n\t *\n\t * @param label - The label to use\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 for this option.\n\t *\n\t * @param value - The value to use\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 for this option.\n\t *\n\t * @param description - The description to use\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 for this option.\n\t *\n\t * @param emoji - The emoji to use\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 BaseSelectMenuBuilder.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 APIComponentInMessageActionRow,\n\ttype APIComponentInModalActionRow,\n\ttype APIComponentInActionRow,\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\n/**\n * The builders that may be used for modals.\n */\nexport type ModalComponentBuilder = ActionRowBuilder | ModalActionRowComponentBuilder;\n\n/**\n * The builders that may be used within an action row for messages.\n */\nexport type MessageActionRowComponentBuilder =\n\t| ButtonBuilder\n\t| ChannelSelectMenuBuilder\n\t| MentionableSelectMenuBuilder\n\t| RoleSelectMenuBuilder\n\t| StringSelectMenuBuilder\n\t| UserSelectMenuBuilder;\n\n/**\n * The builders that may be used within an action row for modals.\n */\nexport type ModalActionRowComponentBuilder = TextInputBuilder;\n\n/**\n * Any builder.\n */\nexport type AnyComponentBuilder = MessageActionRowComponentBuilder | ModalActionRowComponentBuilder;\n\n/**\n * A builder that creates API-compatible JSON data for action rows.\n *\n * @typeParam ComponentType - 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: ComponentType[];\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 ComponentType[];\n\t}\n\n\t/**\n\t * Adds components to this action row.\n\t *\n\t * @param components - The components to add\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 components for this action row.\n\t *\n\t * @param components - The components to set\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\tAPIComponentInActionRow,\n\tAPIBaseComponent,\n\tComponentType,\n\tAPIMessageComponent,\n\tAPIModalComponent,\n} from 'discord-api-types/v10';\nimport { idValidator } from './Assertions';\n\n/**\n * Any action row component data represented as an object.\n */\nexport type AnyAPIActionRowComponent =\n\t| APIActionRowComponent\n\t| APIComponentInActionRow\n\t| APIMessageComponent\n\t| APIModalComponent;\n\n/**\n * The base component builder that contains common symbols for all sorts of components.\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 builder to API-compatible JSON data.\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\t/**\n\t * Constructs a new kind of component.\n\t *\n\t * @param data - The data to construct a component out of\n\t */\n\tpublic constructor(data: Partial) {\n\t\tthis.data = data;\n\t}\n\n\t/**\n\t * Sets the id (not the custom id) for this component.\n\t *\n\t * @param id - The id for this component\n\t */\n\tpublic setId(id: number) {\n\t\tthis.data.id = idValidator.parse(id);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the id of this component, defaulting to a default incremented id.\n\t */\n\tpublic clearId() {\n\t\tthis.data.id = undefined;\n\t\treturn this;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport { ComponentType, type APIMessageComponent, type APIModalComponent } from 'discord-api-types/v10';\nimport {\n\tActionRowBuilder,\n\ttype MessageActionRowComponentBuilder,\n\ttype AnyComponentBuilder,\n\ttype ModalComponentBuilder,\n} from './ActionRow.js';\nimport { ComponentBuilder } from './Component.js';\nimport { ButtonBuilder } from './button/Button.js';\nimport { FileUploadBuilder } from './fileUpload/FileUpload.js';\nimport { LabelBuilder } from './label/Label.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';\nimport { ContainerBuilder } from './v2/Container.js';\nimport { FileBuilder } from './v2/File.js';\nimport { MediaGalleryBuilder } from './v2/MediaGallery.js';\nimport { SectionBuilder } from './v2/Section.js';\nimport { SeparatorBuilder } from './v2/Separator.js';\nimport { TextDisplayBuilder } from './v2/TextDisplay.js';\nimport { ThumbnailBuilder } from './v2/Thumbnail.js';\n\n/**\n * The builders that may be used for messages.\n */\nexport type MessageComponentBuilder =\n\t| ActionRowBuilder\n\t| ContainerBuilder\n\t| FileBuilder\n\t| MediaGalleryBuilder\n\t| MessageActionRowComponentBuilder\n\t| SectionBuilder\n\t| SeparatorBuilder\n\t| TextDisplayBuilder\n\t| ThumbnailBuilder;\n\n/**\n * Components here are mapped to their respective builder.\n */\nexport interface MappedComponentTypes {\n\t/**\n\t * The action row component type is associated with an {@link ActionRowBuilder}.\n\t */\n\t[ComponentType.ActionRow]: ActionRowBuilder;\n\t/**\n\t * The button component type is associated with a {@link ButtonBuilder}.\n\t */\n\t[ComponentType.Button]: ButtonBuilder;\n\t/**\n\t * The string select component type is associated with a {@link StringSelectMenuBuilder}.\n\t */\n\t[ComponentType.StringSelect]: StringSelectMenuBuilder;\n\t/**\n\t * The text input component type is associated with a {@link TextInputBuilder}.\n\t */\n\t[ComponentType.TextInput]: TextInputBuilder;\n\t/**\n\t * The user select component type is associated with a {@link UserSelectMenuBuilder}.\n\t */\n\t[ComponentType.UserSelect]: UserSelectMenuBuilder;\n\t/**\n\t * The role select component type is associated with a {@link RoleSelectMenuBuilder}.\n\t */\n\t[ComponentType.RoleSelect]: RoleSelectMenuBuilder;\n\t/**\n\t * The mentionable select component type is associated with a {@link MentionableSelectMenuBuilder}.\n\t */\n\t[ComponentType.MentionableSelect]: MentionableSelectMenuBuilder;\n\t/**\n\t * The channel select component type is associated with a {@link ChannelSelectMenuBuilder}.\n\t */\n\t[ComponentType.ChannelSelect]: ChannelSelectMenuBuilder;\n\t/**\n\t * The file component type is associated with a {@link FileBuilder}.\n\t */\n\t[ComponentType.File]: FileBuilder;\n\t/**\n\t * The separator component type is associated with a {@link SeparatorBuilder}.\n\t */\n\t[ComponentType.Separator]: SeparatorBuilder;\n\t/**\n\t * The container component type is associated with a {@link ContainerBuilder}.\n\t */\n\t[ComponentType.Container]: ContainerBuilder;\n\t/**\n\t * The text display component type is associated with a {@link TextDisplayBuilder}.\n\t */\n\t[ComponentType.TextDisplay]: TextDisplayBuilder;\n\t/**\n\t * The thumbnail component type is associated with a {@link ThumbnailBuilder}.\n\t */\n\t[ComponentType.Thumbnail]: ThumbnailBuilder;\n\t/**\n\t * The section component type is associated with a {@link SectionBuilder}.\n\t */\n\t[ComponentType.Section]: SectionBuilder;\n\t/**\n\t * The media gallery component type is associated with a {@link MediaGalleryBuilder}.\n\t */\n\t[ComponentType.MediaGallery]: MediaGalleryBuilder;\n\t/**\n\t * The label component type is associated with a {@link LabelBuilder}.\n\t */\n\t[ComponentType.Label]: LabelBuilder;\n\t/**\n\t * The file upload component type is associated with a {@link FileUploadBuilder}.\n\t */\n\t[ComponentType.FileUpload]: FileUploadBuilder;\n}\n\n/**\n * Factory for creating components from API data.\n *\n * @typeParam ComponentType - The type of component to use\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-constituents\n\tdata: (APIModalComponent | APIMessageComponent) & { type: ComponentType },\n): MappedComponentTypes[ComponentType];\n\n/**\n * Factory for creating components from API data.\n *\n * @typeParam ComponentBuilder - The type of component to use\n * @param data - The API data to transform to a component class\n */\nexport function createComponentBuilder(\n\tdata: ComponentBuilder,\n): ComponentBuilder;\n\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\tcase ComponentType.File:\n\t\t\treturn new FileBuilder(data);\n\t\tcase ComponentType.Container:\n\t\t\treturn new ContainerBuilder(data);\n\t\tcase ComponentType.Section:\n\t\t\treturn new SectionBuilder(data);\n\t\tcase ComponentType.Separator:\n\t\t\treturn new SeparatorBuilder(data);\n\t\tcase ComponentType.TextDisplay:\n\t\t\treturn new TextDisplayBuilder(data);\n\t\tcase ComponentType.Thumbnail:\n\t\t\treturn new ThumbnailBuilder(data);\n\t\tcase ComponentType.MediaGallery:\n\t\t\treturn new MediaGalleryBuilder(data);\n\t\tcase ComponentType.Label:\n\t\t\treturn new LabelBuilder(data);\n\t\tcase ComponentType.FileUpload:\n\t\t\treturn new FileUploadBuilder(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\nfunction isBuilder>(\n\tbuilder: unknown,\n\tConstructor: new () => Builder,\n): builder is Builder {\n\treturn builder instanceof Constructor;\n}\n\nexport function resolveBuilder, Builder extends JSONEncodable>(\n\tbuilder: Builder | ComponentType | ((builder: Builder) => Builder),\n\tConstructor: new (data?: ComponentType) => Builder,\n) {\n\tif (isBuilder(builder, Constructor)) {\n\t\treturn builder;\n\t}\n\n\tif (typeof builder === 'function') {\n\t\treturn builder(new Constructor());\n\t}\n\n\treturn new Constructor(builder);\n}\n","import {\n\tComponentType,\n\ttype APIButtonComponent,\n\ttype APIButtonComponentWithCustomId,\n\ttype APIButtonComponentWithSKUId,\n\ttype APIButtonComponentWithURL,\n\ttype APIMessageComponentEmoji,\n\ttype ButtonStyle,\n\ttype Snowflake,\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 * A builder that creates API-compatible JSON data for buttons.\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 to use\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 use\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\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 SKU id that represents a purchasable SKU for this button.\n\t *\n\t * @remarks Only available when using premium-style buttons.\n\t * @param skuId - The SKU id to use\n\t */\n\tpublic setSKUId(skuId: Snowflake) {\n\t\t(this.data as APIButtonComponentWithSKUId).sku_id = skuId;\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 use\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\t(this.data as Exclude).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 use\n\t */\n\tpublic setLabel(label: string) {\n\t\t(this.data as Exclude).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\t(this.data as Exclude).label,\n\t\t\t(this.data as Exclude).emoji,\n\t\t\t(this.data as APIButtonComponentWithCustomId).custom_id,\n\t\t\t(this.data as APIButtonComponentWithSKUId).sku_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 APIFileUploadComponent, ComponentType } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component.js';\nimport { fileUploadPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for file uploads.\n */\nexport class FileUploadBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new file upload.\n\t *\n\t * @param data - The API data to create this file upload with\n\t * @example\n\t * Creating a file upload from an API data object:\n\t * ```ts\n\t * const fileUpload = new FileUploadBuilder({\n\t * \tcustom_id: \"file_upload\",\n\t * min_values: 2,\n\t * max_values: 5,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a file upload using setters and API data:\n\t * ```ts\n\t * const fileUpload = new FileUploadBuilder({\n\t * \tcustom_id: \"file_upload\",\n\t * min_values: 2,\n\t * max_values: 5,\n\t * }).setRequired();\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({ type: ComponentType.FileUpload, ...data });\n\t}\n\n\t/**\n\t * Sets the custom id for this file upload.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customId;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum number of file uploads required.\n\t *\n\t * @param minValues - The minimum values that must be uploaded\n\t */\n\tpublic setMinValues(minValues: number) {\n\t\tthis.data.min_values = minValues;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the minimum values.\n\t */\n\tpublic clearMinValues() {\n\t\tthis.data.min_values = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum number of file uploads required.\n\t *\n\t * @param maxValues - The maximum values that can be uploaded\n\t */\n\tpublic setMaxValues(maxValues: number) {\n\t\tthis.data.max_values = maxValues;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the maximum values.\n\t */\n\tpublic clearMaxValues() {\n\t\tthis.data.max_values = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this file upload is required.\n\t *\n\t * @param required - Whether this file upload is required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = required;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIFileUploadComponent {\n\t\tfileUploadPredicate.parse(this.data);\n\t\treturn this.data as APIFileUploadComponent;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { customIdValidator, idValidator } from '../Assertions.js';\n\nexport const fileUploadPredicate = s.object({\n\ttype: s.literal(ComponentType.FileUpload),\n\tid: idValidator.optional(),\n\tcustom_id: customIdValidator,\n\tmin_values: s.number().greaterThanOrEqual(0).lessThanOrEqual(10).optional(),\n\tmax_values: s.number().greaterThanOrEqual(1).lessThanOrEqual(10).optional(),\n\trequired: s.boolean().optional(),\n});\n","import type {\n\tAPIChannelSelectComponent,\n\tAPIFileUploadComponent,\n\tAPILabelComponent,\n\tAPIMentionableSelectComponent,\n\tAPIRoleSelectComponent,\n\tAPIStringSelectComponent,\n\tAPITextInputComponent,\n\tAPIUserSelectComponent,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component.js';\nimport { createComponentBuilder, resolveBuilder } from '../Components.js';\nimport { FileUploadBuilder } from '../fileUpload/FileUpload.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';\nimport { labelPredicate } from './Assertions.js';\n\nexport interface LabelBuilderData extends Partial> {\n\tcomponent?:\n\t\t| ChannelSelectMenuBuilder\n\t\t| FileUploadBuilder\n\t\t| MentionableSelectMenuBuilder\n\t\t| RoleSelectMenuBuilder\n\t\t| StringSelectMenuBuilder\n\t\t| TextInputBuilder\n\t\t| UserSelectMenuBuilder;\n}\n\n/**\n * A builder that creates API-compatible JSON data for labels.\n */\nexport class LabelBuilder extends ComponentBuilder {\n\t/**\n\t * @internal\n\t */\n\tpublic override readonly data: LabelBuilderData;\n\n\t/**\n\t * Creates a new label.\n\t *\n\t * @param data - The API data to create this label with\n\t * @example\n\t * Creating a label from an API data object:\n\t * ```ts\n\t * const label = new LabelBuilder({\n\t * \tlabel: \"label\",\n\t * \tcomponent,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a label using setters and API data:\n\t * ```ts\n\t * const label = new LabelBuilder({\n\t * \tlabel: 'label',\n\t * \tcomponent,\n\t * }).setLabel('new text');\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({ type: ComponentType.Label });\n\n\t\tconst { component, ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...rest,\n\t\t\tcomponent: component ? createComponentBuilder(component) : undefined,\n\t\t\ttype: ComponentType.Label,\n\t\t};\n\t}\n\n\t/**\n\t * Sets the label for this label.\n\t *\n\t * @param label - The label to use\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = label;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description for this label.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = description;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description for this label.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a string select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setStringSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIStringSelectComponent\n\t\t\t| StringSelectMenuBuilder\n\t\t\t| ((builder: StringSelectMenuBuilder) => StringSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, StringSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a user select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setUserSelectMenuComponent(\n\t\tinput: APIUserSelectComponent | UserSelectMenuBuilder | ((builder: UserSelectMenuBuilder) => UserSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, UserSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a role select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setRoleSelectMenuComponent(\n\t\tinput: APIRoleSelectComponent | RoleSelectMenuBuilder | ((builder: RoleSelectMenuBuilder) => RoleSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, RoleSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a mentionable select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setMentionableSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIMentionableSelectComponent\n\t\t\t| MentionableSelectMenuBuilder\n\t\t\t| ((builder: MentionableSelectMenuBuilder) => MentionableSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, MentionableSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a channel select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setChannelSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIChannelSelectComponent\n\t\t\t| ChannelSelectMenuBuilder\n\t\t\t| ((builder: ChannelSelectMenuBuilder) => ChannelSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, ChannelSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a text input component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setTextInputComponent(\n\t\tinput: APITextInputComponent | TextInputBuilder | ((builder: TextInputBuilder) => TextInputBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, TextInputBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a file upload component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setFileUploadComponent(\n\t\tinput: APIFileUploadComponent | FileUploadBuilder | ((builder: FileUploadBuilder) => FileUploadBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, FileUploadBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APILabelComponent {\n\t\tconst { component, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...rest,\n\t\t\t// The label predicate validates the component.\n\t\t\tcomponent: component?.toJSON(),\n\t\t};\n\n\t\tlabelPredicate.parse(data);\n\n\t\treturn data as APILabelComponent;\n\t}\n}\n","import {\n\ttype APIChannelSelectComponent,\n\ttype ChannelType,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { channelTypesValidator, customIdValidator, optionsLengthValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for channel select menus.\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\t/**\n\t * Adds channel types to this select menu.\n\t *\n\t * @param types - The channel types to use\n\t */\n\tpublic addChannelTypes(...types: RestOrArray) {\n\t\tconst normalizedTypes = normalizeArray(types);\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.push(...channelTypesValidator.parse(normalizedTypes));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets channel types for this select menu.\n\t *\n\t * @param types - The channel types to use\n\t */\n\tpublic setChannelTypes(...types: RestOrArray) {\n\t\tconst normalizedTypes = normalizeArray(types);\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.splice(0, this.data.channel_types.length, ...channelTypesValidator.parse(normalizedTypes));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default channels to this auto populated select menu.\n\t *\n\t * @param channels - The channels to add\n\t */\n\tpublic addDefaultChannels(...channels: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(channels);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Channel as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default channels for this auto populated select menu.\n\t *\n\t * @param channels - The channels to set\n\t */\n\tpublic setDefaultChannels(...channels: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(channels);\n\t\toptionsLengthValidator.parse(normalizedValues.length);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.Channel as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc BaseSelectMenuBuilder.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 { s } from '@sapphire/shapeshift';\nimport { ComponentType, TextInputStyle } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport { customIdValidator, idValidator } from '../Assertions.js';\n\nexport const textInputStyleValidator = s.nativeEnum(TextInputStyle).setValidationEnabled(isValidationEnabled);\nexport const minLengthValidator = s\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(4_000)\n\t.setValidationEnabled(isValidationEnabled);\nexport const maxLengthValidator = s\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(1)\n\t.lessThanOrEqual(4_000)\n\t.setValidationEnabled(isValidationEnabled);\nexport const requiredValidator = s.boolean().setValidationEnabled(isValidationEnabled);\nexport const valueValidator = s.string().lengthLessThanOrEqual(4_000).setValidationEnabled(isValidationEnabled);\nexport const placeholderValidator = s.string().lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);\nexport const labelValidator = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(45)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const textInputPredicate = s\n\t.object({\n\t\ttype: s.literal(ComponentType.TextInput),\n\t\tcustom_id: customIdValidator,\n\t\tstyle: textInputStyleValidator,\n\t\tid: idValidator.optional(),\n\t\tmin_length: minLengthValidator.optional(),\n\t\tmax_length: maxLengthValidator.optional(),\n\t\tplaceholder: placeholderValidator.optional(),\n\t\tvalue: valueValidator.optional(),\n\t\trequired: requiredValidator.optional(),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredParameters(customId?: string, style?: TextInputStyle) {\n\tcustomIdValidator.parse(customId);\n\ttextInputStyleValidator.parse(style);\n}\n","import type { APISelectMenuComponent } from 'discord-api-types/v10';\nimport { customIdValidator, disabledValidator, minMaxValidator, placeholderValidator } from '../Assertions.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { requiredValidator } from '../textInput/Assertions.js';\n\n/**\n * The base select menu builder that contains common symbols for select menu builders.\n *\n * @typeParam SelectMenuType - The type of select menu this would be instantiated for.\n */\nexport abstract 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\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 can be selected in the select menu.\n\t *\n\t * @param maxValues - The maximum values that can 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\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\t/**\n\t * Sets whether this select menu is required.\n\t *\n\t * @remarks Only for use in modals.\n\t * @param required - Whether this select menu is required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = requiredValidator.parse(required);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): 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 {\n\ttype APIMentionableSelectComponent,\n\ttype APISelectMenuDefaultValue,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { optionsLengthValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for mentionable select menus.\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\t/**\n\t * Adds default roles to this auto populated select menu.\n\t *\n\t * @param roles - The roles to add\n\t */\n\tpublic addDefaultRoles(...roles: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default users to this auto populated select menu.\n\t *\n\t * @param users - The users to add\n\t */\n\tpublic addDefaultUsers(...users: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(users);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default values to this auto populated select menu.\n\t *\n\t * @param values - The values to add\n\t */\n\tpublic addDefaultValues(\n\t\t...values: RestOrArray<\n\t\t\t| APISelectMenuDefaultValue\n\t\t\t| APISelectMenuDefaultValue\n\t\t>\n\t) {\n\t\tconst normalizedValues = normalizeArray(values);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\t\tthis.data.default_values.push(...normalizedValues);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default values for this auto populated select menu.\n\t *\n\t * @param values - The values to set\n\t */\n\tpublic setDefaultValues(\n\t\t...values: RestOrArray<\n\t\t\t| APISelectMenuDefaultValue\n\t\t\t| APISelectMenuDefaultValue\n\t\t>\n\t) {\n\t\tconst normalizedValues = normalizeArray(values);\n\t\toptionsLengthValidator.parse(normalizedValues.length);\n\t\tthis.data.default_values = normalizedValues;\n\t\treturn this;\n\t}\n}\n","import {\n\ttype APIRoleSelectComponent,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { optionsLengthValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for role select menus.\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\t/**\n\t * Adds default roles to this auto populated select menu.\n\t *\n\t * @param roles - The roles to add\n\t */\n\tpublic addDefaultRoles(...roles: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default roles for this auto populated select menu.\n\t *\n\t * @param roles - The roles to set\n\t */\n\tpublic setDefaultRoles(...roles: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\t\toptionsLengthValidator.parse(normalizedValues.length);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n}\n","import { ComponentType } from 'discord-api-types/v10';\nimport type { APIStringSelectComponent, APISelectMenuOption } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { optionsLengthValidator, validateRequiredSelectMenuParameters } from '../Assertions.js';\nimport { selectMenuStringOptionPredicate } from './Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\nimport { StringSelectMenuOptionBuilder } from './StringSelectMenuOption.js';\n\n/**\n * A builder that creates API-compatible JSON data for string select menus.\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\n\t */\n\tpublic addOptions(...options: RestOrArray) {\n\t\tconst normalizedOptions = normalizeArray(options);\n\t\toptionsLengthValidator.parse(this.options.length + normalizedOptions.length);\n\t\tthis.options.push(\n\t\t\t...normalizedOptions.map((normalizedOption) =>\n\t\t\t\tnormalizedOption instanceof StringSelectMenuOptionBuilder\n\t\t\t\t\t? normalizedOption\n\t\t\t\t\t: new StringSelectMenuOptionBuilder(selectMenuStringOptionPredicate.parse(normalizedOption)),\n\t\t\t),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the options for this select menu.\n\t *\n\t * @param options - The options to set\n\t */\n\tpublic setOptions(...options: RestOrArray) {\n\t\treturn this.spliceOptions(0, this.options.length, ...options);\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts options for this select menu.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | Array.prototype.splice()}.\n\t * It's useful for modifying and adjusting the order of existing options.\n\t * @example\n\t * Remove the first option:\n\t * ```ts\n\t * selectMenu.spliceOptions(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n option:\n\t * ```ts\n\t * const n = 4;\n\t * selectMenu.spliceOptions(0, n);\n\t * ```\n\t * @example\n\t * Remove the last option:\n\t * ```ts\n\t * selectMenu.spliceOptions(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of options to remove\n\t * @param options - The replacing option objects or builders\n\t */\n\tpublic spliceOptions(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...options: RestOrArray\n\t) {\n\t\tconst normalizedOptions = normalizeArray(options);\n\n\t\tconst clone = [...this.options];\n\n\t\tclone.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...normalizedOptions.map((normalizedOption) =>\n\t\t\t\tnormalizedOption instanceof StringSelectMenuOptionBuilder\n\t\t\t\t\t? normalizedOption\n\t\t\t\t\t: new StringSelectMenuOptionBuilder(selectMenuStringOptionPredicate.parse(normalizedOption)),\n\t\t\t),\n\t\t);\n\n\t\toptionsLengthValidator.parse(clone.length);\n\t\tthis.options.splice(0, this.options.length, ...clone);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc BaseSelectMenuBuilder.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 { Result, s } from '@sapphire/shapeshift';\nimport { ChannelType, ComponentType, SelectMenuDefaultValueType } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport { customIdValidator, emojiValidator, idValidator } from '../Assertions.js';\n\nconst selectMenuBasePredicate = s.object({\n\tid: idValidator.optional(),\n\tplaceholder: s.string().lengthLessThanOrEqual(150).optional(),\n\tmin_values: s.number().greaterThanOrEqual(0).lessThanOrEqual(25).optional(),\n\tmax_values: s.number().greaterThanOrEqual(0).lessThanOrEqual(25).optional(),\n\tcustom_id: customIdValidator,\n\tdisabled: s.boolean().optional(),\n});\n\nexport const selectMenuChannelPredicate = selectMenuBasePredicate\n\t.extend({\n\t\ttype: s.literal(ComponentType.ChannelSelect),\n\t\tchannel_types: s.nativeEnum(ChannelType).array().optional(),\n\t\tdefault_values: s\n\t\t\t.object({ id: s.string(), type: s.literal(SelectMenuDefaultValueType.Channel) })\n\t\t\t.array()\n\t\t\t.lengthLessThanOrEqual(25)\n\t\t\t.optional(),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const selectMenuMentionablePredicate = selectMenuBasePredicate\n\t.extend({\n\t\ttype: s.literal(ComponentType.MentionableSelect),\n\t\tdefault_values: s\n\t\t\t.object({\n\t\t\t\tid: s.string(),\n\t\t\t\ttype: s.union([s.literal(SelectMenuDefaultValueType.Role), s.literal(SelectMenuDefaultValueType.User)]),\n\t\t\t})\n\t\t\t.array()\n\t\t\t.lengthLessThanOrEqual(25)\n\t\t\t.optional(),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const selectMenuRolePredicate = selectMenuBasePredicate\n\t.extend({\n\t\ttype: s.literal(ComponentType.RoleSelect),\n\t\tdefault_values: s\n\t\t\t.object({ id: s.string(), type: s.literal(SelectMenuDefaultValueType.Role) })\n\t\t\t.array()\n\t\t\t.lengthLessThanOrEqual(25)\n\t\t\t.optional(),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const selectMenuUserPredicate = selectMenuBasePredicate\n\t.extend({\n\t\ttype: s.literal(ComponentType.UserSelect),\n\t\tdefault_values: s\n\t\t\t.object({ id: s.string(), type: s.literal(SelectMenuDefaultValueType.User) })\n\t\t\t.array()\n\t\t\t.lengthLessThanOrEqual(25)\n\t\t\t.optional(),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const selectMenuStringOptionPredicate = s\n\t.object({\n\t\tlabel: s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100),\n\t\tvalue: s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100),\n\t\tdescription: s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).optional(),\n\t\temoji: emojiValidator.optional(),\n\t\tdefault: s.boolean().optional(),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const selectMenuStringPredicate = selectMenuBasePredicate\n\t.extend({\n\t\ttype: s.literal(ComponentType.StringSelect),\n\t\toptions: selectMenuStringOptionPredicate.array().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(25),\n\t})\n\t.reshape((value) => {\n\t\tif (value.min_values !== undefined && value.options.length < value.min_values) {\n\t\t\treturn Result.err(new RangeError(`The number of options must be greater than or equal to min_values`));\n\t\t}\n\n\t\tif (value.min_values !== undefined && value.max_values !== undefined && value.min_values > value.max_values) {\n\t\t\treturn Result.err(\n\t\t\t\tnew RangeError(`The maximum amount of options must be greater than or equal to the minimum amount of options`),\n\t\t\t);\n\t\t}\n\n\t\treturn Result.ok(value);\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n","import {\n\ttype APIUserSelectComponent,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { optionsLengthValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for user select menus.\n */\nexport class UserSelectMenuBuilder extends BaseSelectMenuBuilder {\n\t/**\n\t * Creates a new select menu from API data.\n\t *\n\t * @param data - The API data to create this select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new UserSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new UserSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1);\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ ...data, type: ComponentType.UserSelect });\n\t}\n\n\t/**\n\t * Adds default users to this auto populated select menu.\n\t *\n\t * @param users - The users to add\n\t */\n\tpublic addDefaultUsers(...users: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(users);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default users for this auto populated select menu.\n\t *\n\t * @param users - The users to set\n\t */\n\tpublic setDefaultUsers(...users: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(users);\n\t\toptionsLengthValidator.parse(normalizedValues.length);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n}\n","import { isJSONEncodable, type Equatable, type JSONEncodable } from '@discordjs/util';\nimport { ComponentType, type TextInputStyle, type APITextInputComponent } from 'discord-api-types/v10';\nimport isEqual from 'fast-deep-equal';\nimport { customIdValidator } from '../Assertions.js';\nimport { ComponentBuilder } from '../Component.js';\nimport {\n\tmaxLengthValidator,\n\tminLengthValidator,\n\tplaceholderValidator,\n\trequiredValidator,\n\tvalueValidator,\n\tvalidateRequiredParameters,\n\tlabelValidator,\n\ttextInputStyleValidator,\n} from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for text inputs.\n */\nexport class TextInputBuilder\n\textends ComponentBuilder\n\timplements Equatable>\n{\n\t/**\n\t * Creates a new text input from API data.\n\t *\n\t * @param data - The API data to create this text input with\n\t * @example\n\t * Creating a text input from an API data object:\n\t * ```ts\n\t * const textInput = new TextInputBuilder({\n\t * \tcustom_id: 'a cool text input',\n\t * \tplaceholder: 'Type something',\n\t * \tstyle: TextInputStyle.Short,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a text input using setters and API data:\n\t * ```ts\n\t * const textInput = new TextInputBuilder({\n\t * \tplaceholder: 'Type something else',\n\t * })\n\t * \t.setCustomId('woah')\n\t * \t.setStyle(TextInputStyle.Paragraph);\n\t * ```\n\t */\n\tpublic constructor(data?: APITextInputComponent & { type?: ComponentType.TextInput }) {\n\t\tsuper({ type: ComponentType.TextInput, ...data });\n\t}\n\n\t/**\n\t * Sets the custom id for this text input.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the label for this text input.\n\t *\n\t * @param label - The label to use\n\t * @deprecated Use a label builder to create a label (and optionally a description) instead.\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = labelValidator.parse(label);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the style for this text input.\n\t *\n\t * @param style - The style to use\n\t */\n\tpublic setStyle(style: TextInputStyle) {\n\t\tthis.data.style = textInputStyleValidator.parse(style);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum length of text for this text input.\n\t *\n\t * @param minLength - The minimum length of text for this text input\n\t */\n\tpublic setMinLength(minLength: number) {\n\t\tthis.data.min_length = minLengthValidator.parse(minLength);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum length of text for this text input.\n\t *\n\t * @param maxLength - The maximum length of text for this text input\n\t */\n\tpublic setMaxLength(maxLength: number) {\n\t\tthis.data.max_length = maxLengthValidator.parse(maxLength);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the placeholder for this text input.\n\t *\n\t * @param placeholder - The placeholder to use\n\t */\n\tpublic setPlaceholder(placeholder: string) {\n\t\tthis.data.placeholder = placeholderValidator.parse(placeholder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value for this text input.\n\t *\n\t * @param value - The value to use\n\t */\n\tpublic setValue(value: string) {\n\t\tthis.data.value = valueValidator.parse(value);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this text input is required.\n\t *\n\t * @param required - Whether this text input is required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = requiredValidator.parse(required);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APITextInputComponent {\n\t\tvalidateRequiredParameters(this.data.custom_id, this.data.style);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as APITextInputComponent;\n\t}\n\n\t/**\n\t * Whether this is equal to another structure.\n\t */\n\tpublic equals(other: APITextInputComponent | JSONEncodable): boolean {\n\t\tif (isJSONEncodable(other)) {\n\t\t\treturn isEqual(other.toJSON(), this.data);\n\t\t}\n\n\t\treturn isEqual(other, this.data);\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport { idValidator } from '../Assertions.js';\nimport { fileUploadPredicate } from '../fileUpload/Assertions.js';\nimport {\n\tselectMenuChannelPredicate,\n\tselectMenuMentionablePredicate,\n\tselectMenuRolePredicate,\n\tselectMenuStringPredicate,\n\tselectMenuUserPredicate,\n} from '../selectMenu/Assertions.js';\nimport { textInputPredicate } from '../textInput/Assertions.js';\n\nexport const labelPredicate = s\n\t.object({\n\t\tid: idValidator.optional(),\n\t\ttype: s.literal(ComponentType.Label),\n\t\tlabel: s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45),\n\t\tdescription: s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).optional(),\n\t\tcomponent: s.union([\n\t\t\ttextInputPredicate,\n\t\t\tselectMenuUserPredicate,\n\t\t\tselectMenuRolePredicate,\n\t\t\tselectMenuMentionablePredicate,\n\t\t\tselectMenuChannelPredicate,\n\t\t\tselectMenuStringPredicate,\n\t\t\tfileUploadPredicate,\n\t\t]),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n","/* eslint-disable jsdoc/check-param-names */\n\nimport type {\n\tAPIActionRowComponent,\n\tAPIComponentInContainer,\n\tAPIComponentInMessageActionRow,\n\tAPIContainerComponent,\n\tAPIFileComponent,\n\tAPIMediaGalleryComponent,\n\tAPISectionComponent,\n\tAPISeparatorComponent,\n\tAPITextDisplayComponent,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport type { RGBTuple } from '../../index.js';\nimport { MediaGalleryBuilder, SectionBuilder } from '../../index.js';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport type { AnyComponentBuilder, MessageActionRowComponentBuilder } from '../ActionRow.js';\nimport { ActionRowBuilder } from '../ActionRow.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { createComponentBuilder, resolveBuilder } from '../Components.js';\nimport { containerColorPredicate, spoilerPredicate } from './Assertions.js';\nimport { FileBuilder } from './File.js';\nimport { SeparatorBuilder } from './Separator.js';\nimport { TextDisplayBuilder } from './TextDisplay.js';\n\n/**\n * The builders that may be used within a container.\n */\nexport type ContainerComponentBuilder =\n\t| ActionRowBuilder\n\t| FileBuilder\n\t| MediaGalleryBuilder\n\t| SectionBuilder\n\t| SeparatorBuilder\n\t| TextDisplayBuilder;\n\n/**\n * A builder that creates API-compatible JSON data for a container.\n */\nexport class ContainerBuilder extends ComponentBuilder {\n\t/**\n\t * The components within this container.\n\t */\n\tpublic readonly components: ContainerComponentBuilder[];\n\n\t/**\n\t * Creates a new container from API data.\n\t *\n\t * @param data - The API data to create this container with\n\t * @example\n\t * Creating a container from an API data object:\n\t * ```ts\n\t * const container = new ContainerBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"Some text here\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating a container using setters and API data:\n\t * ```ts\n\t * const container = new ContainerBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"# Heading\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * })\n\t * .addSeparatorComponents(separator)\n\t * .addSectionComponents(section);\n\t * ```\n\t */\n\tpublic constructor({ components, ...data }: Partial = {}) {\n\t\tsuper({ type: ComponentType.Container, ...data });\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ??\n\t\t\t[]) as ContainerComponentBuilder[];\n\t}\n\n\t/**\n\t * Sets the accent color of this container.\n\t *\n\t * @param color - The color to use\n\t */\n\tpublic setAccentColor(color?: RGBTuple | number): this {\n\t\t// Data assertions\n\t\tcontainerColorPredicate.parse(color);\n\n\t\tif (Array.isArray(color)) {\n\t\t\tconst [red, green, blue] = color;\n\t\t\tthis.data.accent_color = (red << 16) + (green << 8) + blue;\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.data.accent_color = color;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the accent color of this container.\n\t */\n\tpublic clearAccentColor() {\n\t\tthis.data.accent_color = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds action row components to this container.\n\t *\n\t * @param components - The action row components to add\n\t */\n\tpublic addActionRowComponents(\n\t\t...components: RestOrArray<\n\t\t\t| ActionRowBuilder\n\t\t\t| APIActionRowComponent\n\t\t\t| ((builder: ActionRowBuilder) => ActionRowBuilder)\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component) => resolveBuilder(component, ActionRowBuilder)),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds file components to this container.\n\t *\n\t * @param components - The file components to add\n\t */\n\tpublic addFileComponents(\n\t\t...components: RestOrArray FileBuilder)>\n\t) {\n\t\tthis.components.push(...normalizeArray(components).map((component) => resolveBuilder(component, FileBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds media gallery components to this container.\n\t *\n\t * @param components - The media gallery components to add\n\t */\n\tpublic addMediaGalleryComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPIMediaGalleryComponent | MediaGalleryBuilder | ((builder: MediaGalleryBuilder) => MediaGalleryBuilder)\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component) => resolveBuilder(component, MediaGalleryBuilder)),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds section components to this container.\n\t *\n\t * @param components - The section components to add\n\t */\n\tpublic addSectionComponents(\n\t\t...components: RestOrArray SectionBuilder)>\n\t) {\n\t\tthis.components.push(...normalizeArray(components).map((component) => resolveBuilder(component, SectionBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds separator components to this container.\n\t *\n\t * @param components - The separator components to add\n\t */\n\tpublic addSeparatorComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPISeparatorComponent | SeparatorBuilder | ((builder: SeparatorBuilder) => SeparatorBuilder)\n\t\t>\n\t) {\n\t\tthis.components.push(...normalizeArray(components).map((component) => resolveBuilder(component, SeparatorBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds text display components to this container.\n\t *\n\t * @param components - The text display components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component) => resolveBuilder(component, TextDisplayBuilder)),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts components for this container.\n\t *\n\t * @param index - The index to start removing, replacing or inserting components\n\t * @param deleteCount - The amount of components to remove\n\t * @param components - The components to set\n\t */\n\tpublic spliceComponents(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...components: RestOrArray\n\t) {\n\t\tthis.components.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...normalizeArray(components).map((component) =>\n\t\t\t\tcomponent instanceof ComponentBuilder ? component : createComponentBuilder(component),\n\t\t\t),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this container.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoilerPredicate.parse(spoiler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIContainerComponent {\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t} as APIContainerComponent;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { SeparatorSpacingSize } from 'discord-api-types/v10';\nimport { colorPredicate } from '../../messages/embed/Assertions';\nimport { isValidationEnabled } from '../../util/validation';\nimport { ComponentBuilder } from '../Component';\nimport { ButtonBuilder } from '../button/Button';\nimport type { ContainerComponentBuilder } from './Container';\nimport type { MediaGalleryItemBuilder } from './MediaGalleryItem';\nimport type { TextDisplayBuilder } from './TextDisplay';\nimport { ThumbnailBuilder } from './Thumbnail';\n\nexport const unfurledMediaItemPredicate = s\n\t.object({\n\t\turl: s\n\t\t\t.string()\n\t\t\t.url(\n\t\t\t\t{ allowedProtocols: ['http:', 'https:', 'attachment:'] },\n\t\t\t\t{ message: 'Invalid protocol for media URL. Must be http:, https:, or attachment:' },\n\t\t\t),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const descriptionPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(1_024)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const filePredicate = s\n\t.object({\n\t\turl: s\n\t\t\t.string()\n\t\t\t.url({ allowedProtocols: ['attachment:'] }, { message: 'Invalid protocol for file URL. Must be attachment:' }),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const spoilerPredicate = s.boolean();\n\nexport const dividerPredicate = s.boolean();\n\nexport const spacingPredicate = s.nativeEnum(SeparatorSpacingSize);\n\nexport const textDisplayContentPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(4_000)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const accessoryPredicate = s\n\t.instance(ButtonBuilder)\n\t.or(s.instance(ThumbnailBuilder))\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const containerColorPredicate = colorPredicate.nullish();\n\nexport function assertReturnOfBuilder(\n\tinput: unknown,\n\tExpectedInstanceOf: new () => ReturnType,\n): asserts input is ReturnType {\n\ts.instance(ExpectedInstanceOf).setValidationEnabled(isValidationEnabled).parse(input);\n}\n\nexport function validateComponentArray<\n\tReturnType extends ContainerComponentBuilder | MediaGalleryItemBuilder = ContainerComponentBuilder,\n>(input: unknown, min: number, max: number, ExpectedInstanceOf?: new () => ReturnType): asserts input is ReturnType[] {\n\t(ExpectedInstanceOf ? s.instance(ExpectedInstanceOf) : s.instance(ComponentBuilder))\n\t\t.array()\n\t\t.lengthGreaterThanOrEqual(min)\n\t\t.lengthLessThanOrEqual(max)\n\t\t.setValidationEnabled(isValidationEnabled)\n\t\t.parse(input);\n}\n","import type { APIThumbnailComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component';\nimport { descriptionPredicate, spoilerPredicate, unfurledMediaItemPredicate } from './Assertions';\n\nexport class ThumbnailBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new thumbnail from API data.\n\t *\n\t * @param data - The API data to create this thumbnail with\n\t * @example\n\t * Creating a thumbnail from an API data object:\n\t * ```ts\n\t * const thumbnail = new ThumbnailBuilder({\n\t * \tdescription: 'some text',\n\t * media: {\n\t * url: 'https://cdn.discordapp.com/embed/avatars/4.png',\n\t * },\n\t * });\n\t * ```\n\t * @example\n\t * Creating a thumbnail using setters and API data:\n\t * ```ts\n\t * const thumbnail = new ThumbnailBuilder({\n\t * \tmedia: {\n\t * url: 'attachment://image.png',\n\t * },\n\t * })\n\t * \t.setDescription('alt text');\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({\n\t\t\ttype: ComponentType.Thumbnail,\n\t\t\t...data,\n\t\t\tmedia: data.media ? { url: data.media.url } : undefined,\n\t\t});\n\t}\n\n\t/**\n\t * Sets the description of this thumbnail.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = descriptionPredicate.parse(description);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description of this thumbnail.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this thumbnail.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoilerPredicate.parse(spoiler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the media URL of this thumbnail.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.media = unfurledMediaItemPredicate.parse({ url });\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritdoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APIThumbnailComponent {\n\t\tunfurledMediaItemPredicate.parse(this.data.media);\n\n\t\treturn { ...this.data } as APIThumbnailComponent;\n\t}\n}\n","import { ComponentType, type APIFileComponent } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component';\nimport { filePredicate, spoilerPredicate } from './Assertions';\n\nexport class FileBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new file from API data.\n\t *\n\t * @param data - The API data to create this file with\n\t * @example\n\t * Creating a file from an API data object:\n\t * ```ts\n\t * const file = new FileBuilder({\n\t * \tspoiler: true,\n\t * \tfile: {\n\t * \t\turl: 'attachment://file.png',\n\t * \t},\n\t * });\n\t * ```\n\t * @example\n\t * Creating a file using setters and API data:\n\t * ```ts\n\t * const file = new FileBuilder({\n\t * \tfile: {\n\t * \t\turl: 'attachment://image.jpg',\n\t * \t},\n\t * })\n\t * \t.setSpoiler(false);\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({ type: ComponentType.File, ...data, file: data.file ? { url: data.file.url } : undefined });\n\t}\n\n\t/**\n\t * Sets the spoiler status of this file.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoilerPredicate.parse(spoiler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the media URL of this file.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.file = filePredicate.parse({ url });\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APIFileComponent {\n\t\tfilePredicate.parse(this.data.file);\n\n\t\treturn { ...this.data, file: { ...this.data.file } } as APIFileComponent;\n\t}\n}\n","import type { SeparatorSpacingSize, APISeparatorComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component';\nimport { dividerPredicate, spacingPredicate } from './Assertions';\n\nexport class SeparatorBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new separator from API data.\n\t *\n\t * @param data - The API data to create this separator with\n\t * @example\n\t * Creating a separator from an API data object:\n\t * ```ts\n\t * const separator = new SeparatorBuilder({\n\t * \tspacing: SeparatorSpacingSize.Small,\n\t * divider: true,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a separator using setters and API data:\n\t * ```ts\n\t * const separator = new SeparatorBuilder({\n\t * \tspacing: SeparatorSpacingSize.Large,\n\t * })\n\t * \t.setDivider(false);\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({\n\t\t\ttype: ComponentType.Separator,\n\t\t\t...data,\n\t\t});\n\t}\n\n\t/**\n\t * Sets whether this separator should show a divider line.\n\t *\n\t * @param divider - Whether to show a divider line\n\t */\n\tpublic setDivider(divider = true) {\n\t\tthis.data.divider = dividerPredicate.parse(divider);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spacing of this separator.\n\t *\n\t * @param spacing - The spacing to use\n\t */\n\tpublic setSpacing(spacing: SeparatorSpacingSize) {\n\t\tthis.data.spacing = spacingPredicate.parse(spacing);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the spacing of this separator.\n\t */\n\tpublic clearSpacing() {\n\t\tthis.data.spacing = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APISeparatorComponent {\n\t\treturn { ...this.data } as APISeparatorComponent;\n\t}\n}\n","import type { APITextDisplayComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component';\nimport { textDisplayContentPredicate } from './Assertions';\n\nexport class TextDisplayBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new text display from API data.\n\t *\n\t * @param data - The API data to create this text display with\n\t * @example\n\t * Creating a text display from an API data object:\n\t * ```ts\n\t * const textDisplay = new TextDisplayBuilder({\n\t * \tcontent: 'some text',\n\t * });\n\t * ```\n\t * @example\n\t * Creating a text display using setters and API data:\n\t * ```ts\n\t * const textDisplay = new TextDisplayBuilder({\n\t * \tcontent: 'old text',\n\t * })\n\t * \t.setContent('new text');\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({\n\t\t\ttype: ComponentType.TextDisplay,\n\t\t\t...data,\n\t\t});\n\t}\n\n\t/**\n\t * Sets the text of this text display.\n\t *\n\t * @param content - The text to use\n\t */\n\tpublic setContent(content: string) {\n\t\tthis.data.content = textDisplayContentPredicate.parse(content);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APITextDisplayComponent {\n\t\ttextDisplayContentPredicate.parse(this.data.content);\n\n\t\treturn { ...this.data } as APITextDisplayComponent;\n\t}\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport type { APIMediaGalleryComponent, APIMediaGalleryItem } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { resolveBuilder } from '../Components.js';\nimport { assertReturnOfBuilder, validateComponentArray } from './Assertions.js';\nimport { MediaGalleryItemBuilder } from './MediaGalleryItem.js';\n\n/**\n * A builder that creates API-compatible JSON data for a container.\n */\nexport class MediaGalleryBuilder extends ComponentBuilder {\n\t/**\n\t * The components within this container.\n\t */\n\tpublic readonly items: MediaGalleryItemBuilder[];\n\n\t/**\n\t * Creates a new media gallery from API data.\n\t *\n\t * @param data - The API data to create this media gallery with\n\t * @example\n\t * Creating a media gallery from an API data object:\n\t * ```ts\n\t * const mediaGallery = new MediaGalleryBuilder({\n\t * \titems: [\n\t * \t\t{\n\t * \t\t\tdescription: \"Some text here\",\n\t * \t\t\tmedia: {\n\t * \t\t\t\turl: 'https://cdn.discordapp.com/embed/avatars/2.png',\n\t * \t\t\t},\n\t * \t\t},\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating a media gallery using setters and API data:\n\t * ```ts\n\t * const mediaGallery = new MediaGalleryBuilder({\n\t * \titems: [\n\t * \t\t{\n\t * \t\t\tdescription: \"alt text\",\n\t * \t\t\tmedia: {\n\t * \t\t\t\turl: 'https://cdn.discordapp.com/embed/avatars/5.png',\n\t * \t\t\t},\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.addItems(item2, item3);\n\t * ```\n\t */\n\tpublic constructor({ items, ...data }: Partial = {}) {\n\t\tsuper({ type: ComponentType.MediaGallery, ...data });\n\t\tthis.items = items?.map((item) => new MediaGalleryItemBuilder(item)) ?? [];\n\t}\n\n\t/**\n\t * Adds items to this media gallery.\n\t *\n\t * @param items - The items to add\n\t */\n\tpublic addItems(\n\t\t...items: RestOrArray<\n\t\t\tAPIMediaGalleryItem | MediaGalleryItemBuilder | ((builder: MediaGalleryItemBuilder) => MediaGalleryItemBuilder)\n\t\t>\n\t) {\n\t\tthis.items.push(\n\t\t\t...normalizeArray(items).map((input) => {\n\t\t\t\tconst result = resolveBuilder(input, MediaGalleryItemBuilder);\n\n\t\t\t\tassertReturnOfBuilder(result, MediaGalleryItemBuilder);\n\t\t\t\treturn result;\n\t\t\t}),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts media gallery items for this media gallery.\n\t *\n\t * @param index - The index to start removing, replacing or inserting items\n\t * @param deleteCount - The amount of items to remove\n\t * @param items - The items to insert\n\t */\n\tpublic spliceItems(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...items: RestOrArray<\n\t\t\tAPIMediaGalleryItem | MediaGalleryItemBuilder | ((builder: MediaGalleryItemBuilder) => MediaGalleryItemBuilder)\n\t\t>\n\t) {\n\t\tthis.items.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...normalizeArray(items).map((input) => {\n\t\t\t\tconst result = resolveBuilder(input, MediaGalleryItemBuilder);\n\n\t\t\t\tassertReturnOfBuilder(result, MediaGalleryItemBuilder);\n\t\t\t\treturn result;\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 toJSON(): APIMediaGalleryComponent {\n\t\tvalidateComponentArray(this.items, 1, 10, MediaGalleryItemBuilder);\n\t\treturn {\n\t\t\t...this.data,\n\t\t\titems: this.items.map((item) => item.toJSON()),\n\t\t} as APIMediaGalleryComponent;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIMediaGalleryItem } from 'discord-api-types/v10';\nimport { descriptionPredicate, spoilerPredicate, unfurledMediaItemPredicate } from './Assertions';\n\nexport class MediaGalleryItemBuilder implements JSONEncodable {\n\t/**\n\t * The API data associated with this media gallery item.\n\t */\n\tpublic readonly data: Partial;\n\n\t/**\n\t * Creates a new media gallery item from API data.\n\t *\n\t * @param data - The API data to create this media gallery item with\n\t * @example\n\t * Creating a media gallery item from an API data object:\n\t * ```ts\n\t * const item = new MediaGalleryItemBuilder({\n\t * \tdescription: \"Some text here\",\n\t * \tmedia: {\n\t * \t\turl: 'https://cdn.discordapp.com/embed/avatars/2.png',\n\t * \t},\n\t * });\n\t * ```\n\t * @example\n\t * Creating a media gallery item using setters and API data:\n\t * ```ts\n\t * const item = new MediaGalleryItemBuilder({\n\t * \tmedia: {\n\t * \t\turl: 'https://cdn.discordapp.com/embed/avatars/5.png',\n\t * \t},\n\t * })\n\t * \t.setDescription(\"alt text\");\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tthis.data = data;\n\t}\n\n\t/**\n\t * Sets the description of this media gallery item.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = descriptionPredicate.parse(description);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description of this media gallery item.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this media gallery item.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoilerPredicate.parse(spoiler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the media URL of this media gallery item.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.media = unfurledMediaItemPredicate.parse({ url });\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIMediaGalleryItem {\n\t\tunfurledMediaItemPredicate.parse(this.data.media);\n\n\t\treturn { ...this.data } as APIMediaGalleryItem;\n\t}\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport type {\n\tAPIButtonComponent,\n\tAPISectionComponent,\n\tAPITextDisplayComponent,\n\tAPIThumbnailComponent,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ButtonBuilder, ThumbnailBuilder } from '../../index.js';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { createComponentBuilder, resolveBuilder } from '../Components.js';\nimport { accessoryPredicate, assertReturnOfBuilder, validateComponentArray } from './Assertions.js';\nimport { TextDisplayBuilder } from './TextDisplay.js';\n\n/**\n * A builder that creates API-compatible JSON data for a section.\n */\nexport class SectionBuilder extends ComponentBuilder {\n\t/**\n\t * The components within this section.\n\t */\n\tpublic readonly components: ComponentBuilder[];\n\n\t/**\n\t * The accessory of this section.\n\t */\n\tpublic readonly accessory?: ButtonBuilder | ThumbnailBuilder;\n\n\t/**\n\t * Creates a new section from API data.\n\t *\n\t * @param data - The API data to create this section with\n\t * @example\n\t * Creating a section from an API data object:\n\t * ```ts\n\t * const section = new SectionBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"Some text here\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * accessory: {\n\t * media: {\n\t * url: 'https://cdn.discordapp.com/embed/avatars/3.png',\n\t * },\n\t * }\n\t * });\n\t * ```\n\t * @example\n\t * Creating a section using setters and API data:\n\t * ```ts\n\t * const section = new SectionBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"# Heading\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.setPrimaryButtonAccessory(button);\n\t * ```\n\t */\n\tpublic constructor({ components, accessory, ...data }: Partial = {}) {\n\t\tsuper({ type: ComponentType.Section, ...data });\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ?? []) as ComponentBuilder[];\n\t\tthis.accessory = accessory ? createComponentBuilder(accessory) : undefined;\n\t}\n\n\t/**\n\t * Sets the accessory of this section to a button.\n\t *\n\t * @param accessory - The accessory to use\n\t */\n\tpublic setButtonAccessory(\n\t\taccessory: APIButtonComponent | ButtonBuilder | ((builder: ButtonBuilder) => ButtonBuilder),\n\t): this {\n\t\tReflect.set(this, 'accessory', accessoryPredicate.parse(resolveBuilder(accessory, ButtonBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the accessory of this section to a thumbnail.\n\t *\n\t * @param accessory - The accessory to use\n\t */\n\tpublic setThumbnailAccessory(\n\t\taccessory: APIThumbnailComponent | ThumbnailBuilder | ((builder: ThumbnailBuilder) => ThumbnailBuilder),\n\t): this {\n\t\tReflect.set(this, 'accessory', accessoryPredicate.parse(resolveBuilder(accessory, ThumbnailBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds text display components to this section.\n\t *\n\t * @param components - The text display components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...components: RestOrArray TextDisplayBuilder)>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((input) => {\n\t\t\t\tconst result = resolveBuilder(input, TextDisplayBuilder);\n\n\t\t\t\tassertReturnOfBuilder(result, TextDisplayBuilder);\n\t\t\t\treturn result;\n\t\t\t}),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts text display components for this section.\n\t *\n\t * @param index - The index to start removing, replacing or inserting text display components\n\t * @param deleteCount - The amount of text display components to remove\n\t * @param components - The text display components to insert\n\t */\n\tpublic spliceTextDisplayComponents(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...components: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t) {\n\t\tthis.components.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...normalizeArray(components).map((input) => {\n\t\t\t\tconst result = resolveBuilder(input, TextDisplayBuilder);\n\n\t\t\t\tassertReturnOfBuilder(result, TextDisplayBuilder);\n\t\t\t\treturn result;\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 toJSON(): APISectionComponent {\n\t\tvalidateComponentArray(this.components, 1, 3, TextDisplayBuilder);\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t\taccessory: accessoryPredicate.parse(this.accessory).toJSON(),\n\t\t} as APISectionComponent;\n\t}\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tAPITextInputComponent,\n\tAPIActionRowComponent,\n\tAPIComponentInModalActionRow,\n\tAPILabelComponent,\n\tAPIModalInteractionResponseCallbackData,\n\tAPITextDisplayComponent,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../components/ActionRow.js';\nimport { customIdValidator } from '../../components/Assertions.js';\nimport { createComponentBuilder, resolveBuilder } from '../../components/Components.js';\nimport { LabelBuilder } from '../../components/label/Label.js';\nimport { TextInputBuilder } from '../../components/textInput/TextInput.js';\nimport { TextDisplayBuilder } from '../../components/v2/TextDisplay.js';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { titleValidator, validateRequiredParameters } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for modals.\n */\nexport class ModalBuilder implements JSONEncodable {\n\t/**\n\t * The API data associated with this modal.\n\t */\n\tpublic readonly data: Partial;\n\n\t/**\n\t * The components within this modal.\n\t */\n\tpublic readonly components: (ActionRowBuilder | LabelBuilder | TextDisplayBuilder)[] =\n\t\t[];\n\n\t/**\n\t * Creates a new modal from API data.\n\t *\n\t * @param data - The API data to create this modal with\n\t */\n\tpublic constructor({ components, ...data }: Partial = {}) {\n\t\tthis.data = { ...data };\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ?? []) as (\n\t\t\t| ActionRowBuilder\n\t\t\t| LabelBuilder\n\t\t)[];\n\t}\n\n\t/**\n\t * Sets the title of this modal.\n\t *\n\t * @param title - The title to use\n\t */\n\tpublic setTitle(title: string) {\n\t\tthis.data.title = titleValidator.parse(title);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom id of this modal.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds components to this modal.\n\t *\n\t * @param components - The components to add\n\t * @deprecated Use {@link ModalBuilder.addLabelComponents} or {@link ModalBuilder.addTextDisplayComponents} instead\n\t */\n\tpublic addComponents(\n\t\t...components: RestOrArray<\n\t\t\t| ActionRowBuilder\n\t\t\t| APIActionRowComponent\n\t\t\t| APILabelComponent\n\t\t\t| APITextDisplayComponent\n\t\t\t| APITextInputComponent\n\t\t\t| LabelBuilder\n\t\t\t| TextDisplayBuilder\n\t\t\t| TextInputBuilder\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component, idx) => {\n\t\t\t\tif (\n\t\t\t\t\tcomponent instanceof ActionRowBuilder ||\n\t\t\t\t\tcomponent instanceof LabelBuilder ||\n\t\t\t\t\tcomponent instanceof TextDisplayBuilder\n\t\t\t\t) {\n\t\t\t\t\treturn component;\n\t\t\t\t}\n\n\t\t\t\t// Deprecated support\n\t\t\t\tif (component instanceof TextInputBuilder) {\n\t\t\t\t\treturn new ActionRowBuilder().addComponents(component);\n\t\t\t\t}\n\n\t\t\t\tif ('type' in component) {\n\t\t\t\t\tif (component.type === ComponentType.ActionRow) {\n\t\t\t\t\t\treturn new ActionRowBuilder(component);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (component.type === ComponentType.Label) {\n\t\t\t\t\t\treturn new LabelBuilder(component);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (component.type === ComponentType.TextDisplay) {\n\t\t\t\t\t\treturn new TextDisplayBuilder(component);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Deprecated, should go in a label component\n\t\t\t\t\tif (component.type === ComponentType.TextInput) {\n\t\t\t\t\t\treturn new ActionRowBuilder().addComponents(\n\t\t\t\t\t\t\tnew TextInputBuilder(component),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthrow new TypeError(`Invalid component passed in ModalBuilder.addComponents at index ${idx}!`);\n\t\t\t}),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds label components to this modal.\n\t *\n\t * @param components - The components to add\n\t */\n\tpublic addLabelComponents(\n\t\t...components: RestOrArray LabelBuilder)>\n\t) {\n\t\tconst normalized = normalizeArray(components);\n\t\tconst resolved = normalized.map((label) => resolveBuilder(label, LabelBuilder));\n\n\t\tthis.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds text display components to this modal.\n\t *\n\t * @param components - The components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t) {\n\t\tconst normalized = normalizeArray(components);\n\t\tconst resolved = normalized.map((row) => resolveBuilder(row, TextDisplayBuilder));\n\n\t\tthis.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds action rows to this modal.\n\t *\n\t * @param components - The components to add\n\t * @deprecated Use {@link ModalBuilder.addLabelComponents} instead\n\t */\n\tpublic addActionRowComponents(\n\t\t...components: RestOrArray<\n\t\t\t| ActionRowBuilder\n\t\t\t| APIActionRowComponent\n\t\t\t| ((\n\t\t\t\t\tbuilder: ActionRowBuilder,\n\t\t\t ) => ActionRowBuilder)\n\t\t>\n\t) {\n\t\tconst normalized = normalizeArray(components);\n\t\tconst resolved = normalized.map((row) => resolveBuilder(row, ActionRowBuilder));\n\n\t\tthis.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the labels for this modal.\n\t *\n\t * @param components - The components to set\n\t */\n\tpublic setLabelComponents(\n\t\t...components: RestOrArray LabelBuilder)>\n\t) {\n\t\tconst normalized = normalizeArray(components);\n\t\tthis.spliceLabelComponents(0, this.components.length, ...normalized);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts labels for this modal.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t * The maximum amount of labels that can be added is 5.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing labels of a modal.\n\t * @example\n\t * Remove the first label:\n\t * ```ts\n\t * modal.spliceLabelComponents(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n labels:\n\t * ```ts\n\t * const n = 4;\n\t * modal.spliceLabelComponents(0, n);\n\t * ```\n\t * @example\n\t * Remove the last label:\n\t * ```ts\n\t * modal.spliceLabelComponents(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of labels to remove\n\t * @param labels - The replacing label objects\n\t */\n\tpublic spliceLabelComponents(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...labels: (APILabelComponent | LabelBuilder | ((builder: LabelBuilder) => LabelBuilder))[]\n\t): this {\n\t\tconst resolved = labels.map((label) => resolveBuilder(label, LabelBuilder));\n\t\tthis.components.splice(index, deleteCount, ...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets components for this modal.\n\t *\n\t * @param components - The components to set\n\t * @deprecated Use {@link ModalBuilder.setLabelComponents} instead\n\t */\n\tpublic setComponents(\n\t\t...components: RestOrArray | LabelBuilder | TextDisplayBuilder>\n\t) {\n\t\tthis.components.splice(0, this.components.length, ...normalizeArray(components));\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIModalInteractionResponseCallbackData {\n\t\tvalidateRequiredParameters(this.data.custom_id, this.data.title, this.components);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t} as APIModalInteractionResponseCallbackData;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../components/ActionRow.js';\nimport { customIdValidator } from '../../components/Assertions.js';\nimport { LabelBuilder } from '../../components/label/Label.js';\nimport { TextDisplayBuilder } from '../../components/v2/TextDisplay.js';\nimport { isValidationEnabled } from '../../util/validation.js';\n\nexport const titleValidator = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(45)\n\t.setValidationEnabled(isValidationEnabled);\nexport const componentsValidator = s\n\t.union([s.instance(ActionRowBuilder), s.instance(LabelBuilder), s.instance(TextDisplayBuilder)])\n\t.array()\n\t.lengthGreaterThanOrEqual(1)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredParameters(\n\tcustomId?: string,\n\ttitle?: string,\n\tcomponents?: (ActionRowBuilder | LabelBuilder | TextDisplayBuilder)[],\n) {\n\tcustomIdValidator.parse(customId);\n\ttitleValidator.parse(title);\n\tcomponentsValidator.parse(components);\n}\n","import { s } from '@sapphire/shapeshift';\nimport {\n\tApplicationIntegrationType,\n\tInteractionContextType,\n\tLocale,\n\ttype APIApplicationCommandOptionChoice,\n\ttype LocalizationMap,\n} from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder.js';\nimport type { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands.js';\nimport type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase.js';\n\nconst namePredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(32)\n\t.regex(/^[\\p{Ll}\\p{Lm}\\p{Lo}\\p{N}\\p{sc=Devanagari}\\p{sc=Thai}_-]+$/u)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateName(name: unknown): asserts name is string {\n\tnamePredicate.parse(name);\n}\n\nconst descriptionPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(100)\n\t.setValidationEnabled(isValidationEnabled);\nconst localePredicate = s.nativeEnum(Locale);\n\nexport function validateDescription(description: unknown): asserts description is string {\n\tdescriptionPredicate.parse(description);\n}\n\nconst maxArrayLengthPredicate = s.unknown().array().lengthLessThanOrEqual(25).setValidationEnabled(isValidationEnabled);\nexport function validateLocale(locale: unknown) {\n\treturn localePredicate.parse(locale);\n}\n\nexport function validateMaxOptionsLength(options: unknown): asserts options is ToAPIApplicationCommandOptions[] {\n\tmaxArrayLengthPredicate.parse(options);\n}\n\nexport function validateRequiredParameters(\n\tname: string,\n\tdescription: string,\n\toptions: ToAPIApplicationCommandOptions[],\n) {\n\t// Assert name matches all conditions\n\tvalidateName(name);\n\n\t// Assert description conditions\n\tvalidateDescription(description);\n\n\t// Assert options conditions\n\tvalidateMaxOptionsLength(options);\n}\n\nconst booleanPredicate = s.boolean();\n\nexport function validateDefaultPermission(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport function validateRequired(required: unknown): asserts required is boolean {\n\tbooleanPredicate.parse(required);\n}\n\nconst choicesLengthPredicate = s.number().lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);\n\nexport function validateChoicesLength(amountAdding: number, choices?: APIApplicationCommandOptionChoice[]): void {\n\tchoicesLengthPredicate.parse((choices?.length ?? 0) + amountAdding);\n}\n\nexport function assertReturnOfBuilder<\n\tReturnType extends ApplicationCommandOptionBase | SlashCommandSubcommandBuilder | SlashCommandSubcommandGroupBuilder,\n>(input: unknown, ExpectedInstanceOf: new () => ReturnType): asserts input is ReturnType {\n\ts.instance(ExpectedInstanceOf).parse(input);\n}\n\nexport const localizationMapPredicate = s\n\t.object(Object.fromEntries(Object.values(Locale).map((locale) => [locale, s.string().nullish()])))\n\t.strict()\n\t.nullish()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateLocalizationMap(value: unknown): asserts value is LocalizationMap {\n\tlocalizationMapPredicate.parse(value);\n}\n\nconst dmPermissionPredicate = s.boolean().nullish();\n\nexport function validateDMPermission(value: unknown): asserts value is boolean | null | undefined {\n\tdmPermissionPredicate.parse(value);\n}\n\nconst memberPermissionPredicate = s\n\t.union([\n\t\ts.bigint().transform((value) => value.toString()),\n\t\ts\n\t\t\t.number()\n\t\t\t.safeInt()\n\t\t\t.transform((value) => value.toString()),\n\t\ts.string().regex(/^\\d+$/),\n\t])\n\t.nullish();\n\nexport function validateDefaultMemberPermissions(permissions: unknown) {\n\treturn memberPermissionPredicate.parse(permissions);\n}\n\nexport function validateNSFW(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport const contextsPredicate = s.array(\n\ts.nativeEnum(InteractionContextType).setValidationEnabled(isValidationEnabled),\n);\n\nexport const integrationTypesPredicate = s.array(\n\ts.nativeEnum(ApplicationIntegrationType).setValidationEnabled(isValidationEnabled),\n);\n","import type {\n\tAPIApplicationCommandOption,\n\tApplicationIntegrationType,\n\tInteractionContextType,\n\tLocalizationMap,\n\tPermissions,\n} from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription.js';\nimport { SharedSlashCommand } from './mixins/SharedSlashCommand.js';\nimport { SharedSlashCommandOptions } from './mixins/SharedSlashCommandOptions.js';\nimport { SharedSlashCommandSubcommands } from './mixins/SharedSubcommands.js';\n\n/**\n * A builder that creates API-compatible JSON data for slash commands.\n */\n@mix(SharedSlashCommandOptions, SharedNameAndDescription, SharedSlashCommandSubcommands, SharedSlashCommand)\nexport class SlashCommandBuilder {\n\t/**\n\t * The name of this command.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The name localizations of this command.\n\t */\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\t/**\n\t * The description of this command.\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The description localizations of this command.\n\t */\n\tpublic readonly description_localizations?: LocalizationMap;\n\n\t/**\n\t * The options of this command.\n\t */\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\t/**\n\t * The contexts for this command.\n\t */\n\tpublic readonly contexts?: InteractionContextType[];\n\n\t/**\n\t * Whether this command is enabled by default when the application is added to a guild.\n\t *\n\t * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.setDMPermission} instead.\n\t */\n\tpublic readonly default_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The set of permissions represented as a bit set for the command.\n\t */\n\tpublic readonly default_member_permissions: Permissions | null | undefined = undefined;\n\n\t/**\n\t * Indicates whether the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This property is only for global commands.\n\t * @deprecated\n\t * Use {@link SlashCommandBuilder.contexts} instead.\n\t */\n\tpublic readonly dm_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The integration types for this command.\n\t */\n\tpublic readonly integration_types?: ApplicationIntegrationType[];\n\n\t/**\n\t * Whether this command is NSFW.\n\t */\n\tpublic readonly nsfw: boolean | undefined = undefined;\n}\n\nexport interface SlashCommandBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandOptions,\n\t\tSharedSlashCommandSubcommands,\n\t\tSharedSlashCommand {}\n\n/**\n * An interface specifically for slash command subcommands.\n */\nexport interface SlashCommandSubcommandsOnlyBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandSubcommands,\n\t\tSharedSlashCommand {}\n\n/**\n * An interface specifically for slash command options.\n */\nexport interface SlashCommandOptionsOnlyBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandOptions,\n\t\tSharedSlashCommand {}\n\n/**\n * An interface that ensures the `toJSON()` call will return something\n * that can be serialized into API-compatible data.\n */\nexport interface ToAPIApplicationCommandOptions {\n\ttoJSON(): APIApplicationCommandOption;\n}\n","import type { LocaleString, LocalizationMap } from 'discord-api-types/v10';\nimport { validateDescription, validateLocale, validateName } from '../Assertions.js';\n\n/**\n * This mixin holds name and description symbols for slash commands.\n */\nexport class SharedNameAndDescription {\n\t/**\n\t * The name of this command.\n\t */\n\tpublic readonly name!: string;\n\n\t/**\n\t * The name localizations of this command.\n\t */\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\t/**\n\t * The description of this command.\n\t */\n\tpublic readonly description!: string;\n\n\t/**\n\t * The description localizations of this command.\n\t */\n\tpublic readonly description_localizations?: LocalizationMap;\n\n\t/**\n\t * Sets the name of this command.\n\t *\n\t * @param name - The name to use\n\t */\n\tpublic setName(name: string): this {\n\t\t// Assert the name matches the conditions\n\t\tvalidateName(name);\n\n\t\tReflect.set(this, 'name', name);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this command.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\t// Assert the description matches the conditions\n\t\tvalidateDescription(description);\n\n\t\tReflect.set(this, 'description', description);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a name localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedName - The localized name for the given `locale`\n\t */\n\tpublic setNameLocalization(locale: LocaleString, localizedName: string | null) {\n\t\tif (!this.name_localizations) {\n\t\t\tReflect.set(this, 'name_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedName === null) {\n\t\t\tthis.name_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateName(localizedName);\n\n\t\tthis.name_localizations![parsedLocale] = localizedName;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name localizations for this command.\n\t *\n\t * @param localizedNames - The object of localized names to set\n\t */\n\tpublic setNameLocalizations(localizedNames: LocalizationMap | null) {\n\t\tif (localizedNames === null) {\n\t\t\tReflect.set(this, 'name_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'name_localizations', {});\n\n\t\tfor (const args of Object.entries(localizedNames)) {\n\t\t\tthis.setNameLocalization(...(args as [LocaleString, string | null]));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a description localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedDescription - The localized description for the given locale\n\t */\n\tpublic setDescriptionLocalization(locale: LocaleString, localizedDescription: string | null) {\n\t\tif (!this.description_localizations) {\n\t\t\tReflect.set(this, 'description_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedDescription === null) {\n\t\t\tthis.description_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateDescription(localizedDescription);\n\n\t\tthis.description_localizations![parsedLocale] = localizedDescription;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description localizations for this command.\n\t *\n\t * @param localizedDescriptions - The object of localized descriptions to set\n\t */\n\tpublic setDescriptionLocalizations(localizedDescriptions: LocalizationMap | null) {\n\t\tif (localizedDescriptions === null) {\n\t\t\tReflect.set(this, 'description_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'description_localizations', {});\n\t\tfor (const args of Object.entries(localizedDescriptions)) {\n\t\t\tthis.setDescriptionLocalization(...(args as [LocaleString, string | null]));\n\t\t}\n\n\t\treturn this;\n\t}\n}\n","import {\n\tApplicationCommandType,\n\ttype ApplicationIntegrationType,\n\ttype InteractionContextType,\n\ttype LocalizationMap,\n\ttype Permissions,\n\ttype RESTPostAPIChatInputApplicationCommandsJSONBody,\n} from 'discord-api-types/v10';\nimport type { RestOrArray } from '../../../util/normalizeArray.js';\nimport { normalizeArray } from '../../../util/normalizeArray.js';\nimport {\n\tcontextsPredicate,\n\tintegrationTypesPredicate,\n\tvalidateDMPermission,\n\tvalidateDefaultMemberPermissions,\n\tvalidateDefaultPermission,\n\tvalidateLocalizationMap,\n\tvalidateNSFW,\n\tvalidateRequiredParameters,\n} from '../Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder.js';\n\n/**\n * This mixin holds symbols that can be shared in slashcommands independent of options or subcommands.\n */\nexport class SharedSlashCommand {\n\tpublic readonly name: string = undefined!;\n\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\tpublic readonly description: string = undefined!;\n\n\tpublic readonly description_localizations?: LocalizationMap;\n\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\tpublic readonly contexts?: InteractionContextType[];\n\n\t/**\n\t * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.setDMPermission} instead.\n\t */\n\tpublic readonly default_permission: boolean | undefined = undefined;\n\n\tpublic readonly default_member_permissions: Permissions | null | undefined = undefined;\n\n\t/**\n\t * @deprecated Use {@link SharedSlashCommand.contexts} instead.\n\t */\n\tpublic readonly dm_permission: boolean | undefined = undefined;\n\n\tpublic readonly integration_types?: ApplicationIntegrationType[];\n\n\tpublic readonly nsfw: boolean | undefined = undefined;\n\n\t/**\n\t * Sets the contexts of this command.\n\t *\n\t * @param contexts - The contexts\n\t */\n\tpublic setContexts(...contexts: RestOrArray) {\n\t\tReflect.set(this, 'contexts', contextsPredicate.parse(normalizeArray(contexts)));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the integration types of this command.\n\t *\n\t * @param integrationTypes - The integration types\n\t */\n\tpublic setIntegrationTypes(...integrationTypes: RestOrArray) {\n\t\tReflect.set(this, 'integration_types', integrationTypesPredicate.parse(normalizeArray(integrationTypes)));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether the command is enabled by default when the application is added to a guild.\n\t *\n\t * @remarks\n\t * If set to `false`, you will have to later `PUT` the permissions for this command.\n\t * @param value - Whether or not to enable this command by default\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.setDMPermission} instead.\n\t */\n\tpublic setDefaultPermission(value: boolean) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDefaultPermission(value);\n\n\t\tReflect.set(this, 'default_permission', value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the default permissions a member should have in order to run the command.\n\t *\n\t * @remarks\n\t * You can set this to `'0'` to disable the command by default.\n\t * @param permissions - The permissions bit field to set\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t */\n\tpublic setDefaultMemberPermissions(permissions: Permissions | bigint | number | null | undefined) {\n\t\t// Assert the value and parse it\n\t\tconst permissionValue = validateDefaultMemberPermissions(permissions);\n\n\t\tReflect.set(this, 'default_member_permissions', permissionValue);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets if the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This method is only for global commands.\n\t * @param enabled - Whether the command should be enabled in direct messages\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated\n\t * Use {@link SharedSlashCommand.setContexts} instead.\n\t */\n\tpublic setDMPermission(enabled: boolean | null | undefined) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDMPermission(enabled);\n\n\t\tReflect.set(this, 'dm_permission', enabled);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this command is NSFW.\n\t *\n\t * @param nsfw - Whether this command is NSFW\n\t */\n\tpublic setNSFW(nsfw = true) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateNSFW(nsfw);\n\t\tReflect.set(this, 'nsfw', nsfw);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): RESTPostAPIChatInputApplicationCommandsJSONBody {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\tvalidateLocalizationMap(this.name_localizations);\n\t\tvalidateLocalizationMap(this.description_localizations);\n\n\t\treturn {\n\t\t\t...this,\n\t\t\ttype: ApplicationCommandType.ChatInput,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandAttachmentOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command attachment option.\n */\nexport class SlashCommandAttachmentOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic override readonly type = ApplicationCommandOptionType.Attachment as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandAttachmentOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import type { APIApplicationCommandBasicOption, ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { validateRequiredParameters, validateRequired, validateLocalizationMap } from '../Assertions.js';\nimport { SharedNameAndDescription } from './NameAndDescription.js';\n\n/**\n * The base application command option builder that contains common symbols for application command builders.\n */\nexport abstract class ApplicationCommandOptionBase extends SharedNameAndDescription {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic abstract readonly type: ApplicationCommandOptionType;\n\n\t/**\n\t * Whether this option is required.\n\t *\n\t * @defaultValue `false`\n\t */\n\tpublic readonly required: boolean = false;\n\n\t/**\n\t * Sets whether this option is required.\n\t *\n\t * @param required - Whether this option should be required\n\t */\n\tpublic setRequired(required: boolean) {\n\t\t// Assert that you actually passed a boolean\n\t\tvalidateRequired(required);\n\n\t\tReflect.set(this, 'required', required);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\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(): APIApplicationCommandBasicOption;\n\n\t/**\n\t * This method runs required validators on this builder.\n\t */\n\tprotected runRequiredValidations() {\n\t\tvalidateRequiredParameters(this.name, this.description, []);\n\n\t\t// Validate localizations\n\t\tvalidateLocalizationMap(this.name_localizations);\n\t\tvalidateLocalizationMap(this.description_localizations);\n\n\t\t// Assert that you actually passed a boolean\n\t\tvalidateRequired(this.required);\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandBooleanOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command boolean option.\n */\nexport class SlashCommandBooleanOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Boolean as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandBooleanOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandChannelOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionChannelTypesMixin } from '../mixins/ApplicationCommandOptionChannelTypesMixin.js';\n\n/**\n * A slash command channel option.\n */\n@mix(ApplicationCommandOptionChannelTypesMixin)\nexport class SlashCommandChannelOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic override readonly type = ApplicationCommandOptionType.Channel as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandChannelOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandChannelOption extends ApplicationCommandOptionChannelTypesMixin {}\n","import { s } from '@sapphire/shapeshift';\nimport { ChannelType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../../util/normalizeArray';\n\n/**\n * The allowed channel types used for a channel option in a slash command builder.\n *\n * @privateRemarks This can't be dynamic because const enums are erased at runtime.\n * @internal\n */\nconst allowedChannelTypes = [\n\tChannelType.GuildText,\n\tChannelType.GuildVoice,\n\tChannelType.GuildCategory,\n\tChannelType.GuildAnnouncement,\n\tChannelType.AnnouncementThread,\n\tChannelType.PublicThread,\n\tChannelType.PrivateThread,\n\tChannelType.GuildStageVoice,\n\tChannelType.GuildForum,\n\tChannelType.GuildMedia,\n] as const;\n\n/**\n * The type of allowed channel types used for a channel option.\n */\nexport type ApplicationCommandOptionAllowedChannelTypes = (typeof allowedChannelTypes)[number];\n\nconst channelTypesPredicate = s.array(s.union(allowedChannelTypes.map((type) => s.literal(type))));\n\n/**\n * This mixin holds channel type symbols used for options.\n */\nexport class ApplicationCommandOptionChannelTypesMixin {\n\t/**\n\t * The channel types of this option.\n\t */\n\tpublic readonly channel_types?: ApplicationCommandOptionAllowedChannelTypes[];\n\n\t/**\n\t * Adds channel types to this option.\n\t *\n\t * @param channelTypes - The channel types\n\t */\n\tpublic addChannelTypes(...channelTypes: RestOrArray) {\n\t\tif (this.channel_types === undefined) {\n\t\t\tReflect.set(this, 'channel_types', []);\n\t\t}\n\n\t\tthis.channel_types!.push(...channelTypesPredicate.parse(normalizeArray(channelTypes)));\n\n\t\treturn this;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandIntegerOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\n\nconst numberValidator = s.number().int();\n\n/**\n * A slash command integer option.\n */\n@mix(\n\tApplicationCommandNumericOptionMinMaxValueMixin,\n\tApplicationCommandOptionWithAutocompleteMixin,\n\tApplicationCommandOptionWithChoicesMixin,\n)\nexport class SlashCommandIntegerOption\n\textends ApplicationCommandOptionBase\n\timplements ApplicationCommandNumericOptionMinMaxValueMixin\n{\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Integer as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}\n\t */\n\tpublic setMaxValue(max: number): this {\n\t\tnumberValidator.parse(max);\n\n\t\tReflect.set(this, 'max_value', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}\n\t */\n\tpublic setMinValue(min: number): this {\n\t\tnumberValidator.parse(min);\n\n\t\tReflect.set(this, 'min_value', min);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandIntegerOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this } as APIApplicationCommandIntegerOption;\n\t}\n}\n\nexport interface SlashCommandIntegerOption\n\textends ApplicationCommandNumericOptionMinMaxValueMixin,\n\t\tApplicationCommandOptionWithChoicesMixin,\n\t\tApplicationCommandOptionWithAutocompleteMixin {}\n","/**\n * This mixin holds minimum and maximum symbols used for options.\n */\nexport abstract class ApplicationCommandNumericOptionMinMaxValueMixin {\n\t/**\n\t * The maximum value of this option.\n\t */\n\tpublic readonly max_value?: number;\n\n\t/**\n\t * The minimum value of this option.\n\t */\n\tpublic readonly min_value?: number;\n\n\t/**\n\t * Sets the maximum number value of this option.\n\t *\n\t * @param max - The maximum value this option can be\n\t */\n\tpublic abstract setMaxValue(max: number): this;\n\n\t/**\n\t * Sets the minimum number value of this option.\n\t *\n\t * @param min - The minimum value this option can be\n\t */\n\tpublic abstract setMinValue(min: number): this;\n}\n","import { s } from '@sapphire/shapeshift';\nimport type { ApplicationCommandOptionType } from 'discord-api-types/v10';\n\nconst booleanPredicate = s.boolean();\n\n/**\n * This mixin holds choices and autocomplete symbols used for options.\n */\nexport class ApplicationCommandOptionWithAutocompleteMixin {\n\t/**\n\t * Whether this option utilizes autocomplete.\n\t */\n\tpublic readonly autocomplete?: boolean;\n\n\t/**\n\t * The type of this option.\n\t *\n\t * @privateRemarks Since this is present and this is a mixin, this is needed.\n\t */\n\tpublic readonly type!: ApplicationCommandOptionType;\n\n\t/**\n\t * Whether this option uses autocomplete.\n\t *\n\t * @param autocomplete - Whether this option should use autocomplete\n\t */\n\tpublic setAutocomplete(autocomplete: boolean): this {\n\t\t// Assert that you actually passed a boolean\n\t\tbooleanPredicate.parse(autocomplete);\n\n\t\tif (autocomplete && 'choices' in this && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tReflect.set(this, 'autocomplete', autocomplete);\n\n\t\treturn this;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandOptionChoice } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../../util/normalizeArray.js';\nimport { localizationMapPredicate, validateChoicesLength } from '../Assertions.js';\n\nconst stringPredicate = s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100);\nconst numberPredicate = s.number().greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY);\nconst choicesPredicate = s\n\t.object({\n\t\tname: stringPredicate,\n\t\tname_localizations: localizationMapPredicate,\n\t\tvalue: s.union([stringPredicate, numberPredicate]),\n\t})\n\t.array();\n\n/**\n * This mixin holds choices and autocomplete symbols used for options.\n */\nexport class ApplicationCommandOptionWithChoicesMixin {\n\t/**\n\t * The choices of this option.\n\t */\n\tpublic readonly choices?: APIApplicationCommandOptionChoice[];\n\n\t/**\n\t * The type of this option.\n\t *\n\t * @privateRemarks Since this is present and this is a mixin, this is needed.\n\t */\n\tpublic readonly type!: ApplicationCommandOptionType;\n\n\t/**\n\t * Adds multiple choices to this option.\n\t *\n\t * @param choices - The choices to add\n\t */\n\tpublic addChoices(...choices: RestOrArray>): this {\n\t\tconst normalizedChoices = normalizeArray(choices);\n\t\tif (normalizedChoices.length > 0 && 'autocomplete' in this && this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tchoicesPredicate.parse(normalizedChoices);\n\n\t\tif (this.choices === undefined) {\n\t\t\tReflect.set(this, 'choices', []);\n\t\t}\n\n\t\tvalidateChoicesLength(normalizedChoices.length, this.choices);\n\n\t\tfor (const { name, name_localizations, value } of normalizedChoices) {\n\t\t\t// Validate the value\n\t\t\tif (this.type === ApplicationCommandOptionType.String) {\n\t\t\t\tstringPredicate.parse(value);\n\t\t\t} else {\n\t\t\t\tnumberPredicate.parse(value);\n\t\t\t}\n\n\t\t\tthis.choices!.push({ name, name_localizations, value });\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets multiple choices for this option.\n\t *\n\t * @param choices - The choices to set\n\t */\n\tpublic setChoices>(...choices: RestOrArray): this {\n\t\tconst normalizedChoices = normalizeArray(choices);\n\t\tif (normalizedChoices.length > 0 && 'autocomplete' in this && this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tchoicesPredicate.parse(normalizedChoices);\n\n\t\tReflect.set(this, 'choices', []);\n\t\tthis.addChoices(normalizedChoices);\n\n\t\treturn this;\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandMentionableOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command mentionable option.\n */\nexport class SlashCommandMentionableOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Mentionable as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandMentionableOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandNumberOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\n\nconst numberValidator = s.number();\n\n/**\n * A slash command number option.\n */\n@mix(\n\tApplicationCommandNumericOptionMinMaxValueMixin,\n\tApplicationCommandOptionWithAutocompleteMixin,\n\tApplicationCommandOptionWithChoicesMixin,\n)\nexport class SlashCommandNumberOption\n\textends ApplicationCommandOptionBase\n\timplements ApplicationCommandNumericOptionMinMaxValueMixin\n{\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Number as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}\n\t */\n\tpublic setMaxValue(max: number): this {\n\t\tnumberValidator.parse(max);\n\n\t\tReflect.set(this, 'max_value', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}\n\t */\n\tpublic setMinValue(min: number): this {\n\t\tnumberValidator.parse(min);\n\n\t\tReflect.set(this, 'min_value', min);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandNumberOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this } as APIApplicationCommandNumberOption;\n\t}\n}\n\nexport interface SlashCommandNumberOption\n\textends ApplicationCommandNumericOptionMinMaxValueMixin,\n\t\tApplicationCommandOptionWithChoicesMixin,\n\t\tApplicationCommandOptionWithAutocompleteMixin {}\n","import { ApplicationCommandOptionType, type APIApplicationCommandRoleOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command role option.\n */\nexport class SlashCommandRoleOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic override readonly type = ApplicationCommandOptionType.Role as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandRoleOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandStringOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\n\nconst minLengthValidator = s.number().greaterThanOrEqual(0).lessThanOrEqual(6_000);\nconst maxLengthValidator = s.number().greaterThanOrEqual(1).lessThanOrEqual(6_000);\n\n/**\n * A slash command string option.\n */\n@mix(ApplicationCommandOptionWithAutocompleteMixin, ApplicationCommandOptionWithChoicesMixin)\nexport class SlashCommandStringOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.String as const;\n\n\t/**\n\t * The maximum length of this option.\n\t */\n\tpublic readonly max_length?: number;\n\n\t/**\n\t * The minimum length of this option.\n\t */\n\tpublic readonly min_length?: number;\n\n\t/**\n\t * Sets the maximum length of this string option.\n\t *\n\t * @param max - The maximum length this option can be\n\t */\n\tpublic setMaxLength(max: number): this {\n\t\tmaxLengthValidator.parse(max);\n\n\t\tReflect.set(this, 'max_length', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum length of this string option.\n\t *\n\t * @param min - The minimum length this option can be\n\t */\n\tpublic setMinLength(min: number): this {\n\t\tminLengthValidator.parse(min);\n\n\t\tReflect.set(this, 'min_length', min);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandStringOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this } as APIApplicationCommandStringOption;\n\t}\n}\n\nexport interface SlashCommandStringOption\n\textends ApplicationCommandOptionWithChoicesMixin,\n\t\tApplicationCommandOptionWithAutocompleteMixin {}\n","import { ApplicationCommandOptionType, type APIApplicationCommandUserOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command user option.\n */\nexport class SlashCommandUserOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.User as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandUserOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { assertReturnOfBuilder, validateMaxOptionsLength } from '../Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder';\nimport { SlashCommandAttachmentOption } from '../options/attachment.js';\nimport { SlashCommandBooleanOption } from '../options/boolean.js';\nimport { SlashCommandChannelOption } from '../options/channel.js';\nimport { SlashCommandIntegerOption } from '../options/integer.js';\nimport { SlashCommandMentionableOption } from '../options/mentionable.js';\nimport { SlashCommandNumberOption } from '../options/number.js';\nimport { SlashCommandRoleOption } from '../options/role.js';\nimport { SlashCommandStringOption } from '../options/string.js';\nimport { SlashCommandUserOption } from '../options/user.js';\nimport type { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * This mixin holds symbols that can be shared in slash command options.\n *\n * @typeParam TypeAfterAddingOptions - The type this class should return after adding an option.\n */\nexport class SharedSlashCommandOptions<\n\tTypeAfterAddingOptions extends SharedSlashCommandOptions,\n> {\n\tpublic readonly options!: ToAPIApplicationCommandOptions[];\n\n\t/**\n\t * Adds a boolean option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addBooleanOption(\n\t\tinput: SlashCommandBooleanOption | ((builder: SlashCommandBooleanOption) => SlashCommandBooleanOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandBooleanOption);\n\t}\n\n\t/**\n\t * Adds a user option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addUserOption(input: SlashCommandUserOption | ((builder: SlashCommandUserOption) => SlashCommandUserOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandUserOption);\n\t}\n\n\t/**\n\t * Adds a channel option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addChannelOption(\n\t\tinput: SlashCommandChannelOption | ((builder: SlashCommandChannelOption) => SlashCommandChannelOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandChannelOption);\n\t}\n\n\t/**\n\t * Adds a role option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addRoleOption(input: SlashCommandRoleOption | ((builder: SlashCommandRoleOption) => SlashCommandRoleOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandRoleOption);\n\t}\n\n\t/**\n\t * Adds an attachment option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addAttachmentOption(\n\t\tinput: SlashCommandAttachmentOption | ((builder: SlashCommandAttachmentOption) => SlashCommandAttachmentOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandAttachmentOption);\n\t}\n\n\t/**\n\t * Adds a mentionable option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addMentionableOption(\n\t\tinput: SlashCommandMentionableOption | ((builder: SlashCommandMentionableOption) => SlashCommandMentionableOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandMentionableOption);\n\t}\n\n\t/**\n\t * Adds a string option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addStringOption(\n\t\tinput: SlashCommandStringOption | ((builder: SlashCommandStringOption) => SlashCommandStringOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandStringOption);\n\t}\n\n\t/**\n\t * Adds an integer option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addIntegerOption(\n\t\tinput: SlashCommandIntegerOption | ((builder: SlashCommandIntegerOption) => SlashCommandIntegerOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandIntegerOption);\n\t}\n\n\t/**\n\t * Adds a number option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addNumberOption(\n\t\tinput: SlashCommandNumberOption | ((builder: SlashCommandNumberOption) => SlashCommandNumberOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandNumberOption);\n\t}\n\n\t/**\n\t * Where the actual adding magic happens. ✨\n\t *\n\t * @param input - The input. What else?\n\t * @param Instance - The instance of whatever is being added\n\t * @internal\n\t */\n\tprivate _sharedAddOptionMethod(\n\t\tinput: OptionBuilder | ((builder: OptionBuilder) => OptionBuilder),\n\t\tInstance: new () => OptionBuilder,\n\t): TypeAfterAddingOptions {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new Instance()) : input;\n\n\t\tassertReturnOfBuilder(result, Instance);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this as unknown as TypeAfterAddingOptions;\n\t}\n}\n","import {\n\tApplicationCommandOptionType,\n\ttype APIApplicationCommandSubcommandGroupOption,\n\ttype APIApplicationCommandSubcommandOption,\n} from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { assertReturnOfBuilder, validateMaxOptionsLength, validateRequiredParameters } from './Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder.js';\nimport type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase.js';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription.js';\nimport { SharedSlashCommandOptions } from './mixins/SharedSlashCommandOptions.js';\n\n/**\n * Represents a folder for subcommands.\n *\n * @see {@link https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups}\n */\n@mix(SharedNameAndDescription)\nexport class SlashCommandSubcommandGroupBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand group.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand group.\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The subcommands within this subcommand group.\n\t */\n\tpublic readonly options: SlashCommandSubcommandBuilder[] = [];\n\n\t/**\n\t * Adds a new subcommand to this group.\n\t *\n\t * @param input - A function that returns a subcommand builder or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t) {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIApplicationCommandSubcommandGroupOption {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.SubcommandGroup,\n\t\t\tname: this.name,\n\t\t\tname_localizations: this.name_localizations,\n\t\t\tdescription: this.description,\n\t\t\tdescription_localizations: this.description_localizations,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandGroupBuilder extends SharedNameAndDescription {}\n\n/**\n * A builder that creates API-compatible JSON data for slash command subcommands.\n *\n * @see {@link https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups}\n */\n@mix(SharedNameAndDescription, SharedSlashCommandOptions)\nexport class SlashCommandSubcommandBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand.\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The options within this subcommand.\n\t */\n\tpublic readonly options: ApplicationCommandOptionBase[] = [];\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIApplicationCommandSubcommandOption {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.Subcommand,\n\t\t\tname: this.name,\n\t\t\tname_localizations: this.name_localizations,\n\t\t\tdescription: this.description,\n\t\t\tdescription_localizations: this.description_localizations,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandOptions {}\n","import { assertReturnOfBuilder, validateMaxOptionsLength } from '../Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder.js';\nimport { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from '../SlashCommandSubcommands.js';\n\n/**\n * This mixin holds symbols that can be shared in slash subcommands.\n *\n * @typeParam TypeAfterAddingSubcommands - The type this class should return after adding a subcommand or subcommand group.\n */\nexport class SharedSlashCommandSubcommands<\n\tTypeAfterAddingSubcommands extends SharedSlashCommandSubcommands,\n> {\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\t/**\n\t * Adds a new subcommand group to this command.\n\t *\n\t * @param input - A function that returns a subcommand group builder or an already built builder\n\t */\n\tpublic addSubcommandGroup(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandGroupBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandGroupBuilder) => SlashCommandSubcommandGroupBuilder),\n\t): TypeAfterAddingSubcommands {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandGroupBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandGroupBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this as unknown as TypeAfterAddingSubcommands;\n\t}\n\n\t/**\n\t * Adds a new subcommand to this command.\n\t *\n\t * @param input - A function that returns a subcommand builder or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t): TypeAfterAddingSubcommands {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this as unknown as TypeAfterAddingSubcommands;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandType, ApplicationIntegrationType, InteractionContextType } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport type { ContextMenuCommandType } from './ContextMenuCommandBuilder.js';\n\nconst namePredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(32)\n\t.regex(/\\S/)\n\t.setValidationEnabled(isValidationEnabled);\nconst typePredicate = s\n\t.union([s.literal(ApplicationCommandType.User), s.literal(ApplicationCommandType.Message)])\n\t.setValidationEnabled(isValidationEnabled);\nconst booleanPredicate = s.boolean();\n\nexport function validateDefaultPermission(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport function validateName(name: unknown): asserts name is string {\n\tnamePredicate.parse(name);\n}\n\nexport function validateType(type: unknown): asserts type is ContextMenuCommandType {\n\ttypePredicate.parse(type);\n}\n\nexport function validateRequiredParameters(name: string, type: number) {\n\t// Assert name matches all conditions\n\tvalidateName(name);\n\n\t// Assert type is valid\n\tvalidateType(type);\n}\n\nconst dmPermissionPredicate = s.boolean().nullish();\n\nexport function validateDMPermission(value: unknown): asserts value is boolean | null | undefined {\n\tdmPermissionPredicate.parse(value);\n}\n\nconst memberPermissionPredicate = s\n\t.union([\n\t\ts.bigint().transform((value) => value.toString()),\n\t\ts\n\t\t\t.number()\n\t\t\t.safeInt()\n\t\t\t.transform((value) => value.toString()),\n\t\ts.string().regex(/^\\d+$/),\n\t])\n\t.nullish();\n\nexport function validateDefaultMemberPermissions(permissions: unknown) {\n\treturn memberPermissionPredicate.parse(permissions);\n}\n\nexport const contextsPredicate = s.array(\n\ts.nativeEnum(InteractionContextType).setValidationEnabled(isValidationEnabled),\n);\n\nexport const integrationTypesPredicate = s.array(\n\ts.nativeEnum(ApplicationIntegrationType).setValidationEnabled(isValidationEnabled),\n);\n","import type {\n\tApplicationCommandType,\n\tApplicationIntegrationType,\n\tInteractionContextType,\n\tLocaleString,\n\tLocalizationMap,\n\tPermissions,\n\tRESTPostAPIContextMenuApplicationCommandsJSONBody,\n} from 'discord-api-types/v10';\nimport type { RestOrArray } from '../../util/normalizeArray.js';\nimport { normalizeArray } from '../../util/normalizeArray.js';\nimport { validateLocale, validateLocalizationMap } from '../slashCommands/Assertions.js';\nimport {\n\tvalidateRequiredParameters,\n\tvalidateName,\n\tvalidateType,\n\tvalidateDefaultPermission,\n\tvalidateDefaultMemberPermissions,\n\tvalidateDMPermission,\n\tcontextsPredicate,\n\tintegrationTypesPredicate,\n} from './Assertions.js';\n\n/**\n * The type a context menu command can be.\n */\nexport type ContextMenuCommandType = ApplicationCommandType.Message | ApplicationCommandType.User;\n\n/**\n * A builder that creates API-compatible JSON data for context menu commands.\n */\nexport class ContextMenuCommandBuilder {\n\t/**\n\t * The name of this command.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The name localizations of this command.\n\t */\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\t/**\n\t * The type of this command.\n\t */\n\tpublic readonly type: ContextMenuCommandType = undefined!;\n\n\t/**\n\t * The contexts for this command.\n\t */\n\tpublic readonly contexts?: InteractionContextType[];\n\n\t/**\n\t * Whether this command is enabled by default when the application is added to a guild.\n\t *\n\t * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.\n\t */\n\tpublic readonly default_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The set of permissions represented as a bit set for the command.\n\t */\n\tpublic readonly default_member_permissions: Permissions | null | undefined = undefined;\n\n\t/**\n\t * Indicates whether the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This property is only for global commands.\n\t * @deprecated\n\t * Use {@link ContextMenuCommandBuilder.contexts} instead.\n\t */\n\tpublic readonly dm_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The integration types for this command.\n\t */\n\tpublic readonly integration_types?: ApplicationIntegrationType[];\n\n\t/**\n\t * Sets the contexts of this command.\n\t *\n\t * @param contexts - The contexts\n\t */\n\tpublic setContexts(...contexts: RestOrArray) {\n\t\tReflect.set(this, 'contexts', contextsPredicate.parse(normalizeArray(contexts)));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets integration types of this command.\n\t *\n\t * @param integrationTypes - The integration types\n\t */\n\tpublic setIntegrationTypes(...integrationTypes: RestOrArray) {\n\t\tReflect.set(this, 'integration_types', integrationTypesPredicate.parse(normalizeArray(integrationTypes)));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name of this command.\n\t *\n\t * @param name - The name to use\n\t */\n\tpublic setName(name: string) {\n\t\t// Assert the name matches the conditions\n\t\tvalidateName(name);\n\n\t\tReflect.set(this, 'name', name);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the type of this command.\n\t *\n\t * @param type - The type to use\n\t */\n\tpublic setType(type: ContextMenuCommandType) {\n\t\t// Assert the type is valid\n\t\tvalidateType(type);\n\n\t\tReflect.set(this, 'type', type);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether the command is enabled by default when the application is added to a guild.\n\t *\n\t * @remarks\n\t * If set to `false`, you will have to later `PUT` the permissions for this command.\n\t * @param value - Whether to enable this command by default\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.\n\t */\n\tpublic setDefaultPermission(value: boolean) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDefaultPermission(value);\n\n\t\tReflect.set(this, 'default_permission', value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the default permissions a member should have in order to run this command.\n\t *\n\t * @remarks\n\t * You can set this to `'0'` to disable the command by default.\n\t * @param permissions - The permissions bit field to set\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t */\n\tpublic setDefaultMemberPermissions(permissions: Permissions | bigint | number | null | undefined) {\n\t\t// Assert the value and parse it\n\t\tconst permissionValue = validateDefaultMemberPermissions(permissions);\n\n\t\tReflect.set(this, 'default_member_permissions', permissionValue);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets if the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This method is only for global commands.\n\t * @param enabled - Whether the command should be enabled in direct messages\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated Use {@link ContextMenuCommandBuilder.setContexts} instead.\n\t */\n\tpublic setDMPermission(enabled: boolean | null | undefined) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDMPermission(enabled);\n\n\t\tReflect.set(this, 'dm_permission', enabled);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a name localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedName - The localized name for the given `locale`\n\t */\n\tpublic setNameLocalization(locale: LocaleString, localizedName: string | null) {\n\t\tif (!this.name_localizations) {\n\t\t\tReflect.set(this, 'name_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedName === null) {\n\t\t\tthis.name_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateName(localizedName);\n\n\t\tthis.name_localizations![parsedLocale] = localizedName;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name localizations for this command.\n\t *\n\t * @param localizedNames - The object of localized names to set\n\t */\n\tpublic setNameLocalizations(localizedNames: LocalizationMap | null) {\n\t\tif (localizedNames === null) {\n\t\t\tReflect.set(this, 'name_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'name_localizations', {});\n\n\t\tfor (const args of Object.entries(localizedNames))\n\t\t\tthis.setNameLocalization(...(args as [LocaleString, string | null]));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): RESTPostAPIContextMenuApplicationCommandsJSONBody {\n\t\tvalidateRequiredParameters(this.name, this.type);\n\n\t\tvalidateLocalizationMap(this.name_localizations);\n\n\t\treturn { ...this };\n\t}\n}\n","import type { APIEmbed } from 'discord-api-types/v10';\n\n/**\n * Calculates the length of the embed.\n *\n * @param data - The embed data to check\n */\nexport function embedLength(data: APIEmbed) {\n\treturn (\n\t\t(data.title?.length ?? 0) +\n\t\t(data.description?.length ?? 0) +\n\t\t(data.fields?.reduce((prev, curr) => prev + curr.name.length + curr.value.length, 0) ?? 0) +\n\t\t(data.footer?.text.length ?? 0) +\n\t\t(data.author?.name.length ?? 0)\n\t);\n}\n"],"mappings":"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","names":["Assertions_exports","Assertions_exports","import_shapeshift","import_v10","import_v10","import_v10","import_v10","Assertions_exports","import_shapeshift","import_v10","import_v10","import_v10","Assertions_exports","placeholderValidator","import_shapeshift","import_v10","placeholderValidator","import_v10","import_v10","import_v10","Assertions_exports","import_shapeshift","import_v10","import_v10","import_v10","placeholderValidator","isEqual","Assertions_exports","import_shapeshift","import_v10","import_v10","Assertions_exports","descriptionPredicate","import_shapeshift","import_v10","import_v10","descriptionPredicate","descriptionPredicate","import_v10","import_v10","import_v10","import_v10","descriptionPredicate","import_v10","import_v10","Assertions_exports","validateRequiredParameters","import_shapeshift","validateRequiredParameters","validateRequiredParameters","Assertions_exports","assertReturnOfBuilder","validateRequiredParameters","import_shapeshift","import_v10","descriptionPredicate","validateRequiredParameters","assertReturnOfBuilder","import_ts_mixer","import_v10","validateRequiredParameters","import_v10","validateRequiredParameters","import_v10","import_v10","import_shapeshift","import_v10","import_shapeshift","import_v10","import_ts_mixer","import_shapeshift","booleanPredicate","import_shapeshift","import_v10","import_v10","import_shapeshift","import_v10","import_ts_mixer","numberValidator","import_v10","import_shapeshift","import_v10","import_ts_mixer","minLengthValidator","maxLengthValidator","import_v10","assertReturnOfBuilder","import_v10","import_ts_mixer","assertReturnOfBuilder","validateRequiredParameters","assertReturnOfBuilder","Assertions_exports","contextsPredicate","integrationTypesPredicate","validateDMPermission","validateDefaultMemberPermissions","validateDefaultPermission","validateName","validateRequiredParameters","import_shapeshift","import_v10","namePredicate","booleanPredicate","validateDefaultPermission","validateName","validateRequiredParameters","dmPermissionPredicate","validateDMPermission","memberPermissionPredicate","validateDefaultMemberPermissions","contextsPredicate","integrationTypesPredicate","contextsPredicate","integrationTypesPredicate","validateName","validateDefaultPermission","validateDefaultMemberPermissions","validateDMPermission","validateRequiredParameters"]} \ No newline at end of file diff --git a/node_modules/@discordjs/builders/dist/index.mjs b/node_modules/@discordjs/builders/dist/index.mjs index ce5a953..dae80e0 100644 --- a/node_modules/@discordjs/builders/dist/index.mjs +++ b/node_modules/@discordjs/builders/dist/index.mjs @@ -153,7 +153,7 @@ var EmbedBuilder = class { * * @remarks * This method behaves similarly - * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}. + * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}. * The maximum amount of fields that can be added is 25. * * It's useful for modifying and adjusting order of the already-existing fields of an embed. @@ -498,7 +498,7 @@ __name(validateRequiredButtonParameters, "validateRequiredButtonParameters"); // src/components/ActionRow.ts import { - ComponentType as ComponentType16 + ComponentType as ComponentType22 } from "discord-api-types/v10"; // src/components/Component.ts @@ -537,7 +537,7 @@ var ComponentBuilder = class { }; // src/components/Components.ts -import { ComponentType as ComponentType15 } from "discord-api-types/v10"; +import { ComponentType as ComponentType21 } from "discord-api-types/v10"; // src/components/button/Button.ts import { @@ -665,12 +665,163 @@ var ButtonBuilder = class extends ComponentBuilder { } }; +// src/components/fileUpload/FileUpload.ts +import { ComponentType as ComponentType3 } from "discord-api-types/v10"; + +// src/components/fileUpload/Assertions.ts +var Assertions_exports3 = {}; +__export(Assertions_exports3, { + fileUploadPredicate: () => fileUploadPredicate +}); +import { s as s3 } from "@sapphire/shapeshift"; +import { ComponentType as ComponentType2 } from "discord-api-types/v10"; +var fileUploadPredicate = s3.object({ + type: s3.literal(ComponentType2.FileUpload), + id: idValidator.optional(), + custom_id: customIdValidator, + min_values: s3.number().greaterThanOrEqual(0).lessThanOrEqual(10).optional(), + max_values: s3.number().greaterThanOrEqual(1).lessThanOrEqual(10).optional(), + required: s3.boolean().optional() +}); + +// src/components/fileUpload/FileUpload.ts +var FileUploadBuilder = class extends ComponentBuilder { + static { + __name(this, "FileUploadBuilder"); + } + /** + * Creates a new file upload. + * + * @param data - The API data to create this file upload with + * @example + * Creating a file upload from an API data object: + * ```ts + * const fileUpload = new FileUploadBuilder({ + * custom_id: "file_upload", + * min_values: 2, + * max_values: 5, + * }); + * ``` + * @example + * Creating a file upload using setters and API data: + * ```ts + * const fileUpload = new FileUploadBuilder({ + * custom_id: "file_upload", + * min_values: 2, + * max_values: 5, + * }).setRequired(); + * ``` + */ + constructor(data = {}) { + super({ type: ComponentType3.FileUpload, ...data }); + } + /** + * Sets the custom id for this file upload. + * + * @param customId - The custom id to use + */ + setCustomId(customId) { + this.data.custom_id = customId; + return this; + } + /** + * Sets the minimum number of file uploads required. + * + * @param minValues - The minimum values that must be uploaded + */ + setMinValues(minValues) { + this.data.min_values = minValues; + return this; + } + /** + * Clears the minimum values. + */ + clearMinValues() { + this.data.min_values = void 0; + return this; + } + /** + * Sets the maximum number of file uploads required. + * + * @param maxValues - The maximum values that can be uploaded + */ + setMaxValues(maxValues) { + this.data.max_values = maxValues; + return this; + } + /** + * Clears the maximum values. + */ + clearMaxValues() { + this.data.max_values = void 0; + return this; + } + /** + * Sets whether this file upload is required. + * + * @param required - Whether this file upload is required + */ + setRequired(required = true) { + this.data.required = required; + return this; + } + /** + * {@inheritDoc ComponentBuilder.toJSON} + */ + toJSON() { + fileUploadPredicate.parse(this.data); + return this.data; + } +}; + +// src/components/label/Label.ts +import { ComponentType as ComponentType13 } from "discord-api-types/v10"; + // src/components/selectMenu/ChannelSelectMenu.ts import { - ComponentType as ComponentType2, + ComponentType as ComponentType5, SelectMenuDefaultValueType } from "discord-api-types/v10"; +// src/components/textInput/Assertions.ts +var Assertions_exports4 = {}; +__export(Assertions_exports4, { + labelValidator: () => labelValidator, + maxLengthValidator: () => maxLengthValidator, + minLengthValidator: () => minLengthValidator, + placeholderValidator: () => placeholderValidator2, + requiredValidator: () => requiredValidator, + textInputPredicate: () => textInputPredicate, + textInputStyleValidator: () => textInputStyleValidator, + validateRequiredParameters: () => validateRequiredParameters, + valueValidator: () => valueValidator +}); +import { s as s4 } from "@sapphire/shapeshift"; +import { ComponentType as ComponentType4, TextInputStyle } from "discord-api-types/v10"; +var textInputStyleValidator = s4.nativeEnum(TextInputStyle).setValidationEnabled(isValidationEnabled); +var minLengthValidator = s4.number().int().greaterThanOrEqual(0).lessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled); +var maxLengthValidator = s4.number().int().greaterThanOrEqual(1).lessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled); +var requiredValidator = s4.boolean().setValidationEnabled(isValidationEnabled); +var valueValidator = s4.string().lengthLessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled); +var placeholderValidator2 = s4.string().lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled); +var labelValidator = s4.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45).setValidationEnabled(isValidationEnabled); +var textInputPredicate = s4.object({ + type: s4.literal(ComponentType4.TextInput), + custom_id: customIdValidator, + style: textInputStyleValidator, + id: idValidator.optional(), + min_length: minLengthValidator.optional(), + max_length: maxLengthValidator.optional(), + placeholder: placeholderValidator2.optional(), + value: valueValidator.optional(), + required: requiredValidator.optional() +}).setValidationEnabled(isValidationEnabled); +function validateRequiredParameters(customId, style) { + customIdValidator.parse(customId); + textInputStyleValidator.parse(style); +} +__name(validateRequiredParameters, "validateRequiredParameters"); + // src/components/selectMenu/BaseSelectMenu.ts var BaseSelectMenuBuilder = class extends ComponentBuilder { static { @@ -695,9 +846,9 @@ var BaseSelectMenuBuilder = class extends ComponentBuilder { return this; } /** - * Sets the maximum values that must be selected in the select menu. + * Sets the maximum values that can be selected in the select menu. * - * @param maxValues - The maximum values that must be selected + * @param maxValues - The maximum values that can be selected */ setMaxValues(maxValues) { this.data.max_values = minMaxValidator.parse(maxValues); @@ -721,6 +872,16 @@ var BaseSelectMenuBuilder = class extends ComponentBuilder { this.data.disabled = disabledValidator.parse(disabled); return this; } + /** + * Sets whether this select menu is required. + * + * @remarks Only for use in modals. + * @param required - Whether this select menu is required + */ + setRequired(required = true) { + this.data.required = requiredValidator.parse(required); + return this; + } /** * {@inheritDoc ComponentBuilder.toJSON} */ @@ -761,7 +922,7 @@ var ChannelSelectMenuBuilder = class extends BaseSelectMenuBuilder { * ``` */ constructor(data) { - super({ ...data, type: ComponentType2.ChannelSelect }); + super({ ...data, type: ComponentType5.ChannelSelect }); } /** * Adds channel types to this select menu. @@ -829,7 +990,7 @@ var ChannelSelectMenuBuilder = class extends BaseSelectMenuBuilder { // src/components/selectMenu/MentionableSelectMenu.ts import { - ComponentType as ComponentType3, + ComponentType as ComponentType6, SelectMenuDefaultValueType as SelectMenuDefaultValueType2 } from "discord-api-types/v10"; var MentionableSelectMenuBuilder = class extends BaseSelectMenuBuilder { @@ -859,7 +1020,7 @@ var MentionableSelectMenuBuilder = class extends BaseSelectMenuBuilder { * ``` */ constructor(data) { - super({ ...data, type: ComponentType3.MentionableSelect }); + super({ ...data, type: ComponentType6.MentionableSelect }); } /** * Adds default roles to this auto populated select menu. @@ -922,7 +1083,7 @@ var MentionableSelectMenuBuilder = class extends BaseSelectMenuBuilder { // src/components/selectMenu/RoleSelectMenu.ts import { - ComponentType as ComponentType4, + ComponentType as ComponentType7, SelectMenuDefaultValueType as SelectMenuDefaultValueType3 } from "discord-api-types/v10"; var RoleSelectMenuBuilder = class extends BaseSelectMenuBuilder { @@ -952,7 +1113,7 @@ var RoleSelectMenuBuilder = class extends BaseSelectMenuBuilder { * ``` */ constructor(data) { - super({ ...data, type: ComponentType4.RoleSelect }); + super({ ...data, type: ComponentType7.RoleSelect }); } /** * Adds default roles to this auto populated select menu. @@ -988,7 +1149,71 @@ var RoleSelectMenuBuilder = class extends BaseSelectMenuBuilder { }; // src/components/selectMenu/StringSelectMenu.ts -import { ComponentType as ComponentType5 } from "discord-api-types/v10"; +import { ComponentType as ComponentType9 } from "discord-api-types/v10"; + +// src/components/selectMenu/Assertions.ts +var Assertions_exports5 = {}; +__export(Assertions_exports5, { + selectMenuChannelPredicate: () => selectMenuChannelPredicate, + selectMenuMentionablePredicate: () => selectMenuMentionablePredicate, + selectMenuRolePredicate: () => selectMenuRolePredicate, + selectMenuStringOptionPredicate: () => selectMenuStringOptionPredicate, + selectMenuStringPredicate: () => selectMenuStringPredicate, + selectMenuUserPredicate: () => selectMenuUserPredicate +}); +import { Result, s as s5 } from "@sapphire/shapeshift"; +import { ChannelType as ChannelType2, ComponentType as ComponentType8, SelectMenuDefaultValueType as SelectMenuDefaultValueType4 } from "discord-api-types/v10"; +var selectMenuBasePredicate = s5.object({ + id: idValidator.optional(), + placeholder: s5.string().lengthLessThanOrEqual(150).optional(), + min_values: s5.number().greaterThanOrEqual(0).lessThanOrEqual(25).optional(), + max_values: s5.number().greaterThanOrEqual(0).lessThanOrEqual(25).optional(), + custom_id: customIdValidator, + disabled: s5.boolean().optional() +}); +var selectMenuChannelPredicate = selectMenuBasePredicate.extend({ + type: s5.literal(ComponentType8.ChannelSelect), + channel_types: s5.nativeEnum(ChannelType2).array().optional(), + default_values: s5.object({ id: s5.string(), type: s5.literal(SelectMenuDefaultValueType4.Channel) }).array().lengthLessThanOrEqual(25).optional() +}).setValidationEnabled(isValidationEnabled); +var selectMenuMentionablePredicate = selectMenuBasePredicate.extend({ + type: s5.literal(ComponentType8.MentionableSelect), + default_values: s5.object({ + id: s5.string(), + type: s5.union([s5.literal(SelectMenuDefaultValueType4.Role), s5.literal(SelectMenuDefaultValueType4.User)]) + }).array().lengthLessThanOrEqual(25).optional() +}).setValidationEnabled(isValidationEnabled); +var selectMenuRolePredicate = selectMenuBasePredicate.extend({ + type: s5.literal(ComponentType8.RoleSelect), + default_values: s5.object({ id: s5.string(), type: s5.literal(SelectMenuDefaultValueType4.Role) }).array().lengthLessThanOrEqual(25).optional() +}).setValidationEnabled(isValidationEnabled); +var selectMenuUserPredicate = selectMenuBasePredicate.extend({ + type: s5.literal(ComponentType8.UserSelect), + default_values: s5.object({ id: s5.string(), type: s5.literal(SelectMenuDefaultValueType4.User) }).array().lengthLessThanOrEqual(25).optional() +}).setValidationEnabled(isValidationEnabled); +var selectMenuStringOptionPredicate = s5.object({ + label: s5.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100), + value: s5.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100), + description: s5.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).optional(), + emoji: emojiValidator.optional(), + default: s5.boolean().optional() +}).setValidationEnabled(isValidationEnabled); +var selectMenuStringPredicate = selectMenuBasePredicate.extend({ + type: s5.literal(ComponentType8.StringSelect), + options: selectMenuStringOptionPredicate.array().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(25) +}).reshape((value) => { + if (value.min_values !== void 0 && value.options.length < value.min_values) { + return Result.err(new RangeError(`The number of options must be greater than or equal to min_values`)); + } + if (value.min_values !== void 0 && value.max_values !== void 0 && value.min_values > value.max_values) { + return Result.err( + new RangeError(`The maximum amount of options must be greater than or equal to the minimum amount of options`) + ); + } + return Result.ok(value); +}).setValidationEnabled(isValidationEnabled); + +// src/components/selectMenu/StringSelectMenu.ts var StringSelectMenuBuilder = class extends BaseSelectMenuBuilder { static { __name(this, "StringSelectMenuBuilder"); @@ -1030,7 +1255,7 @@ var StringSelectMenuBuilder = class extends BaseSelectMenuBuilder { */ constructor(data) { const { options, ...initData } = data ?? {}; - super({ ...initData, type: ComponentType5.StringSelect }); + super({ ...initData, type: ComponentType9.StringSelect }); this.options = options?.map((option) => new StringSelectMenuOptionBuilder(option)) ?? []; } /** @@ -1043,7 +1268,7 @@ var StringSelectMenuBuilder = class extends BaseSelectMenuBuilder { optionsLengthValidator.parse(this.options.length + normalizedOptions.length); this.options.push( ...normalizedOptions.map( - (normalizedOption) => normalizedOption instanceof StringSelectMenuOptionBuilder ? normalizedOption : new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(normalizedOption)) + (normalizedOption) => normalizedOption instanceof StringSelectMenuOptionBuilder ? normalizedOption : new StringSelectMenuOptionBuilder(selectMenuStringOptionPredicate.parse(normalizedOption)) ) ); return this; @@ -1090,7 +1315,7 @@ var StringSelectMenuBuilder = class extends BaseSelectMenuBuilder { index, deleteCount, ...normalizedOptions.map( - (normalizedOption) => normalizedOption instanceof StringSelectMenuOptionBuilder ? normalizedOption : new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(normalizedOption)) + (normalizedOption) => normalizedOption instanceof StringSelectMenuOptionBuilder ? normalizedOption : new StringSelectMenuOptionBuilder(selectMenuStringOptionPredicate.parse(normalizedOption)) ) ); optionsLengthValidator.parse(clone.length); @@ -1111,8 +1336,8 @@ var StringSelectMenuBuilder = class extends BaseSelectMenuBuilder { // src/components/selectMenu/UserSelectMenu.ts import { - ComponentType as ComponentType6, - SelectMenuDefaultValueType as SelectMenuDefaultValueType4 + ComponentType as ComponentType10, + SelectMenuDefaultValueType as SelectMenuDefaultValueType5 } from "discord-api-types/v10"; var UserSelectMenuBuilder = class extends BaseSelectMenuBuilder { static { @@ -1141,7 +1366,7 @@ var UserSelectMenuBuilder = class extends BaseSelectMenuBuilder { * ``` */ constructor(data) { - super({ ...data, type: ComponentType6.UserSelect }); + super({ ...data, type: ComponentType10.UserSelect }); } /** * Adds default users to this auto populated select menu. @@ -1155,7 +1380,7 @@ var UserSelectMenuBuilder = class extends BaseSelectMenuBuilder { this.data.default_values.push( ...normalizedValues.map((id) => ({ id, - type: SelectMenuDefaultValueType4.User + type: SelectMenuDefaultValueType5.User })) ); return this; @@ -1170,7 +1395,7 @@ var UserSelectMenuBuilder = class extends BaseSelectMenuBuilder { optionsLengthValidator.parse(normalizedValues.length); this.data.default_values = normalizedValues.map((id) => ({ id, - type: SelectMenuDefaultValueType4.User + type: SelectMenuDefaultValueType5.User })); return this; } @@ -1178,38 +1403,8 @@ var UserSelectMenuBuilder = class extends BaseSelectMenuBuilder { // src/components/textInput/TextInput.ts import { isJSONEncodable } from "@discordjs/util"; -import { ComponentType as ComponentType7 } from "discord-api-types/v10"; +import { ComponentType as ComponentType11 } from "discord-api-types/v10"; import isEqual from "fast-deep-equal"; - -// src/components/textInput/Assertions.ts -var Assertions_exports3 = {}; -__export(Assertions_exports3, { - labelValidator: () => labelValidator, - maxLengthValidator: () => maxLengthValidator, - minLengthValidator: () => minLengthValidator, - placeholderValidator: () => placeholderValidator2, - requiredValidator: () => requiredValidator, - textInputStyleValidator: () => textInputStyleValidator, - validateRequiredParameters: () => validateRequiredParameters, - valueValidator: () => valueValidator -}); -import { s as s3 } from "@sapphire/shapeshift"; -import { TextInputStyle } from "discord-api-types/v10"; -var textInputStyleValidator = s3.nativeEnum(TextInputStyle); -var minLengthValidator = s3.number().int().greaterThanOrEqual(0).lessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled); -var maxLengthValidator = s3.number().int().greaterThanOrEqual(1).lessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled); -var requiredValidator = s3.boolean(); -var valueValidator = s3.string().lengthLessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled); -var placeholderValidator2 = s3.string().lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled); -var labelValidator = s3.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45).setValidationEnabled(isValidationEnabled); -function validateRequiredParameters(customId, style, label) { - customIdValidator.parse(customId); - textInputStyleValidator.parse(style); - labelValidator.parse(label); -} -__name(validateRequiredParameters, "validateRequiredParameters"); - -// src/components/textInput/TextInput.ts var TextInputBuilder = class extends ComponentBuilder { static { __name(this, "TextInputBuilder"); @@ -1223,7 +1418,7 @@ var TextInputBuilder = class extends ComponentBuilder { * ```ts * const textInput = new TextInputBuilder({ * custom_id: 'a cool text input', - * label: 'Type something', + * placeholder: 'Type something', * style: TextInputStyle.Short, * }); * ``` @@ -1231,14 +1426,14 @@ var TextInputBuilder = class extends ComponentBuilder { * Creating a text input using setters and API data: * ```ts * const textInput = new TextInputBuilder({ - * label: 'Type something else', + * placeholder: 'Type something else', * }) * .setCustomId('woah') * .setStyle(TextInputStyle.Paragraph); * ``` */ constructor(data) { - super({ type: ComponentType7.TextInput, ...data }); + super({ type: ComponentType11.TextInput, ...data }); } /** * Sets the custom id for this text input. @@ -1253,6 +1448,7 @@ var TextInputBuilder = class extends ComponentBuilder { * Sets the label for this text input. * * @param label - The label to use + * @deprecated Use a label builder to create a label (and optionally a description) instead. */ setLabel(label) { this.data.label = labelValidator.parse(label); @@ -1316,7 +1512,7 @@ var TextInputBuilder = class extends ComponentBuilder { * {@inheritDoc ComponentBuilder.toJSON} */ toJSON() { - validateRequiredParameters(this.data.custom_id, this.data.style, this.data.label); + validateRequiredParameters(this.data.custom_id, this.data.style); return { ...this.data }; @@ -1332,12 +1528,177 @@ var TextInputBuilder = class extends ComponentBuilder { } }; -// src/components/v2/Container.ts +// src/components/label/Assertions.ts +var Assertions_exports6 = {}; +__export(Assertions_exports6, { + labelPredicate: () => labelPredicate +}); +import { s as s6 } from "@sapphire/shapeshift"; import { ComponentType as ComponentType12 } from "discord-api-types/v10"; +var labelPredicate = s6.object({ + id: idValidator.optional(), + type: s6.literal(ComponentType12.Label), + label: s6.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45), + description: s6.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).optional(), + component: s6.union([ + textInputPredicate, + selectMenuUserPredicate, + selectMenuRolePredicate, + selectMenuMentionablePredicate, + selectMenuChannelPredicate, + selectMenuStringPredicate, + fileUploadPredicate + ]) +}).setValidationEnabled(isValidationEnabled); + +// src/components/label/Label.ts +var LabelBuilder = class extends ComponentBuilder { + static { + __name(this, "LabelBuilder"); + } + /** + * @internal + */ + data; + /** + * Creates a new label. + * + * @param data - The API data to create this label with + * @example + * Creating a label from an API data object: + * ```ts + * const label = new LabelBuilder({ + * label: "label", + * component, + * }); + * ``` + * @example + * Creating a label using setters and API data: + * ```ts + * const label = new LabelBuilder({ + * label: 'label', + * component, + * }).setLabel('new text'); + * ``` + */ + constructor(data = {}) { + super({ type: ComponentType13.Label }); + const { component, ...rest } = data; + this.data = { + ...rest, + component: component ? createComponentBuilder(component) : void 0, + type: ComponentType13.Label + }; + } + /** + * Sets the label for this label. + * + * @param label - The label to use + */ + setLabel(label) { + this.data.label = label; + return this; + } + /** + * Sets the description for this label. + * + * @param description - The description to use + */ + setDescription(description) { + this.data.description = description; + return this; + } + /** + * Clears the description for this label. + */ + clearDescription() { + this.data.description = void 0; + return this; + } + /** + * Sets a string select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setStringSelectMenuComponent(input) { + this.data.component = resolveBuilder(input, StringSelectMenuBuilder); + return this; + } + /** + * Sets a user select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setUserSelectMenuComponent(input) { + this.data.component = resolveBuilder(input, UserSelectMenuBuilder); + return this; + } + /** + * Sets a role select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setRoleSelectMenuComponent(input) { + this.data.component = resolveBuilder(input, RoleSelectMenuBuilder); + return this; + } + /** + * Sets a mentionable select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setMentionableSelectMenuComponent(input) { + this.data.component = resolveBuilder(input, MentionableSelectMenuBuilder); + return this; + } + /** + * Sets a channel select menu component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setChannelSelectMenuComponent(input) { + this.data.component = resolveBuilder(input, ChannelSelectMenuBuilder); + return this; + } + /** + * Sets a text input component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setTextInputComponent(input) { + this.data.component = resolveBuilder(input, TextInputBuilder); + return this; + } + /** + * Sets a file upload component to this label. + * + * @param input - A function that returns a component builder or an already built builder + */ + setFileUploadComponent(input) { + this.data.component = resolveBuilder(input, FileUploadBuilder); + return this; + } + /** + * {@inheritDoc ComponentBuilder.toJSON} + */ + toJSON() { + const { component, ...rest } = this.data; + const data = { + ...rest, + // The label predicate validates the component. + component: component?.toJSON() + }; + labelPredicate.parse(data); + return data; + } +}; + +// src/components/v2/Container.ts +import { ComponentType as ComponentType18 } from "discord-api-types/v10"; // src/components/v2/Assertions.ts -var Assertions_exports4 = {}; -__export(Assertions_exports4, { +var Assertions_exports7 = {}; +__export(Assertions_exports7, { accessoryPredicate: () => accessoryPredicate, assertReturnOfBuilder: () => assertReturnOfBuilder, containerColorPredicate: () => containerColorPredicate, @@ -1350,11 +1711,11 @@ __export(Assertions_exports4, { unfurledMediaItemPredicate: () => unfurledMediaItemPredicate, validateComponentArray: () => validateComponentArray }); -import { s as s4 } from "@sapphire/shapeshift"; +import { s as s7 } from "@sapphire/shapeshift"; import { SeparatorSpacingSize } from "discord-api-types/v10"; // src/components/v2/Thumbnail.ts -import { ComponentType as ComponentType8 } from "discord-api-types/v10"; +import { ComponentType as ComponentType14 } from "discord-api-types/v10"; var ThumbnailBuilder = class extends ComponentBuilder { static { __name(this, "ThumbnailBuilder"); @@ -1386,7 +1747,7 @@ var ThumbnailBuilder = class extends ComponentBuilder { */ constructor(data = {}) { super({ - type: ComponentType8.Thumbnail, + type: ComponentType14.Thumbnail, ...data, media: data.media ? { url: data.media.url } : void 0 }); @@ -1435,33 +1796,33 @@ var ThumbnailBuilder = class extends ComponentBuilder { }; // src/components/v2/Assertions.ts -var unfurledMediaItemPredicate = s4.object({ - url: s4.string().url( +var unfurledMediaItemPredicate = s7.object({ + url: s7.string().url( { allowedProtocols: ["http:", "https:", "attachment:"] }, { message: "Invalid protocol for media URL. Must be http:, https:, or attachment:" } ) }).setValidationEnabled(isValidationEnabled); -var descriptionPredicate2 = s4.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(1024).setValidationEnabled(isValidationEnabled); -var filePredicate = s4.object({ - url: s4.string().url({ allowedProtocols: ["attachment:"] }, { message: "Invalid protocol for file URL. Must be attachment:" }) +var descriptionPredicate2 = s7.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(1024).setValidationEnabled(isValidationEnabled); +var filePredicate = s7.object({ + url: s7.string().url({ allowedProtocols: ["attachment:"] }, { message: "Invalid protocol for file URL. Must be attachment:" }) }).setValidationEnabled(isValidationEnabled); -var spoilerPredicate = s4.boolean(); -var dividerPredicate = s4.boolean(); -var spacingPredicate = s4.nativeEnum(SeparatorSpacingSize); -var textDisplayContentPredicate = s4.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled); -var accessoryPredicate = s4.instance(ButtonBuilder).or(s4.instance(ThumbnailBuilder)).setValidationEnabled(isValidationEnabled); +var spoilerPredicate = s7.boolean(); +var dividerPredicate = s7.boolean(); +var spacingPredicate = s7.nativeEnum(SeparatorSpacingSize); +var textDisplayContentPredicate = s7.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled); +var accessoryPredicate = s7.instance(ButtonBuilder).or(s7.instance(ThumbnailBuilder)).setValidationEnabled(isValidationEnabled); var containerColorPredicate = colorPredicate.nullish(); function assertReturnOfBuilder(input, ExpectedInstanceOf) { - s4.instance(ExpectedInstanceOf).setValidationEnabled(isValidationEnabled).parse(input); + s7.instance(ExpectedInstanceOf).setValidationEnabled(isValidationEnabled).parse(input); } __name(assertReturnOfBuilder, "assertReturnOfBuilder"); function validateComponentArray(input, min, max, ExpectedInstanceOf) { - (ExpectedInstanceOf ? s4.instance(ExpectedInstanceOf) : s4.instance(ComponentBuilder)).array().lengthGreaterThanOrEqual(min).lengthLessThanOrEqual(max).setValidationEnabled(isValidationEnabled).parse(input); + (ExpectedInstanceOf ? s7.instance(ExpectedInstanceOf) : s7.instance(ComponentBuilder)).array().lengthGreaterThanOrEqual(min).lengthLessThanOrEqual(max).setValidationEnabled(isValidationEnabled).parse(input); } __name(validateComponentArray, "validateComponentArray"); // src/components/v2/File.ts -import { ComponentType as ComponentType9 } from "discord-api-types/v10"; +import { ComponentType as ComponentType15 } from "discord-api-types/v10"; var FileBuilder = class extends ComponentBuilder { static { __name(this, "FileBuilder"); @@ -1492,7 +1853,7 @@ var FileBuilder = class extends ComponentBuilder { * ``` */ constructor(data = {}) { - super({ type: ComponentType9.File, ...data, file: data.file ? { url: data.file.url } : void 0 }); + super({ type: ComponentType15.File, ...data, file: data.file ? { url: data.file.url } : void 0 }); } /** * Sets the spoiler status of this file. @@ -1522,7 +1883,7 @@ var FileBuilder = class extends ComponentBuilder { }; // src/components/v2/Separator.ts -import { ComponentType as ComponentType10 } from "discord-api-types/v10"; +import { ComponentType as ComponentType16 } from "discord-api-types/v10"; var SeparatorBuilder = class extends ComponentBuilder { static { __name(this, "SeparatorBuilder"); @@ -1550,7 +1911,7 @@ var SeparatorBuilder = class extends ComponentBuilder { */ constructor(data = {}) { super({ - type: ComponentType10.Separator, + type: ComponentType16.Separator, ...data }); } @@ -1588,7 +1949,7 @@ var SeparatorBuilder = class extends ComponentBuilder { }; // src/components/v2/TextDisplay.ts -import { ComponentType as ComponentType11 } from "discord-api-types/v10"; +import { ComponentType as ComponentType17 } from "discord-api-types/v10"; var TextDisplayBuilder = class extends ComponentBuilder { static { __name(this, "TextDisplayBuilder"); @@ -1615,7 +1976,7 @@ var TextDisplayBuilder = class extends ComponentBuilder { */ constructor(data = {}) { super({ - type: ComponentType11.TextDisplay, + type: ComponentType17.TextDisplay, ...data }); } @@ -1673,11 +2034,12 @@ var ContainerBuilder = class extends ComponentBuilder { * }, * ], * }) - * .addComponents(separator, section); + * .addSeparatorComponents(separator) + * .addSectionComponents(section); * ``` */ constructor({ components, ...data } = {}) { - super({ type: ComponentType12.Container, ...data }); + super({ type: ComponentType18.Container, ...data }); this.components = components?.map((component) => createComponentBuilder(component)) ?? []; } /** @@ -1800,7 +2162,7 @@ var ContainerBuilder = class extends ComponentBuilder { }; // src/components/v2/MediaGallery.ts -import { ComponentType as ComponentType13 } from "discord-api-types/v10"; +import { ComponentType as ComponentType19 } from "discord-api-types/v10"; // src/components/v2/MediaGalleryItem.ts var MediaGalleryItemBuilder = class { @@ -1930,7 +2292,7 @@ var MediaGalleryBuilder = class extends ComponentBuilder { * ``` */ constructor({ items, ...data } = {}) { - super({ type: ComponentType13.MediaGallery, ...data }); + super({ type: ComponentType19.MediaGallery, ...data }); this.items = items?.map((item) => new MediaGalleryItemBuilder(item)) ?? []; } /** @@ -1980,7 +2342,7 @@ var MediaGalleryBuilder = class extends ComponentBuilder { }; // src/components/v2/Section.ts -import { ComponentType as ComponentType14 } from "discord-api-types/v10"; +import { ComponentType as ComponentType20 } from "discord-api-types/v10"; var SectionBuilder = class extends ComponentBuilder { static { __name(this, "SectionBuilder"); @@ -2029,7 +2391,7 @@ var SectionBuilder = class extends ComponentBuilder { * ``` */ constructor({ components, accessory, ...data } = {}) { - super({ type: ComponentType14.Section, ...data }); + super({ type: ComponentType20.Section, ...data }); this.components = components?.map((component) => createComponentBuilder(component)) ?? []; this.accessory = accessory ? createComponentBuilder(accessory) : void 0; } @@ -2104,36 +2466,40 @@ function createComponentBuilder(data) { return data; } switch (data.type) { - case ComponentType15.ActionRow: + case ComponentType21.ActionRow: return new ActionRowBuilder(data); - case ComponentType15.Button: + case ComponentType21.Button: return new ButtonBuilder(data); - case ComponentType15.StringSelect: + case ComponentType21.StringSelect: return new StringSelectMenuBuilder(data); - case ComponentType15.TextInput: + case ComponentType21.TextInput: return new TextInputBuilder(data); - case ComponentType15.UserSelect: + case ComponentType21.UserSelect: return new UserSelectMenuBuilder(data); - case ComponentType15.RoleSelect: + case ComponentType21.RoleSelect: return new RoleSelectMenuBuilder(data); - case ComponentType15.MentionableSelect: + case ComponentType21.MentionableSelect: return new MentionableSelectMenuBuilder(data); - case ComponentType15.ChannelSelect: + case ComponentType21.ChannelSelect: return new ChannelSelectMenuBuilder(data); - case ComponentType15.File: + case ComponentType21.File: return new FileBuilder(data); - case ComponentType15.Container: + case ComponentType21.Container: return new ContainerBuilder(data); - case ComponentType15.Section: + case ComponentType21.Section: return new SectionBuilder(data); - case ComponentType15.Separator: + case ComponentType21.Separator: return new SeparatorBuilder(data); - case ComponentType15.TextDisplay: + case ComponentType21.TextDisplay: return new TextDisplayBuilder(data); - case ComponentType15.Thumbnail: + case ComponentType21.Thumbnail: return new ThumbnailBuilder(data); - case ComponentType15.MediaGallery: + case ComponentType21.MediaGallery: return new MediaGalleryBuilder(data); + case ComponentType21.Label: + return new LabelBuilder(data); + case ComponentType21.FileUpload: + return new FileUploadBuilder(data); default: throw new Error(`Cannot properly serialize component type: ${data.type}`); } @@ -2198,7 +2564,7 @@ var ActionRowBuilder = class extends ComponentBuilder { * ``` */ constructor({ components, ...data } = {}) { - super({ type: ComponentType16.ActionRow, ...data }); + super({ type: ComponentType22.ActionRow, ...data }); this.components = components?.map((component) => createComponentBuilder(component)) ?? []; } /** @@ -2230,16 +2596,19 @@ var ActionRowBuilder = class extends ComponentBuilder { } }; +// src/interactions/modals/Modal.ts +import { ComponentType as ComponentType23 } from "discord-api-types/v10"; + // src/interactions/modals/Assertions.ts -var Assertions_exports5 = {}; -__export(Assertions_exports5, { +var Assertions_exports8 = {}; +__export(Assertions_exports8, { componentsValidator: () => componentsValidator, titleValidator: () => titleValidator, validateRequiredParameters: () => validateRequiredParameters2 }); -import { s as s5 } from "@sapphire/shapeshift"; -var titleValidator = s5.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45).setValidationEnabled(isValidationEnabled); -var componentsValidator = s5.instance(ActionRowBuilder).array().lengthGreaterThanOrEqual(1).setValidationEnabled(isValidationEnabled); +import { s as s8 } from "@sapphire/shapeshift"; +var titleValidator = s8.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45).setValidationEnabled(isValidationEnabled); +var componentsValidator = s8.union([s8.instance(ActionRowBuilder), s8.instance(LabelBuilder), s8.instance(TextDisplayBuilder)]).array().lengthGreaterThanOrEqual(1).setValidationEnabled(isValidationEnabled); function validateRequiredParameters2(customId, title, components) { customIdValidator.parse(customId); titleValidator.parse(title); @@ -2291,19 +2660,121 @@ var ModalBuilder = class { * Adds components to this modal. * * @param components - The components to add + * @deprecated Use {@link ModalBuilder.addLabelComponents} or {@link ModalBuilder.addTextDisplayComponents} instead */ addComponents(...components) { this.components.push( - ...normalizeArray(components).map( - (component) => component instanceof ActionRowBuilder ? component : new ActionRowBuilder(component) - ) + ...normalizeArray(components).map((component, idx) => { + if (component instanceof ActionRowBuilder || component instanceof LabelBuilder || component instanceof TextDisplayBuilder) { + return component; + } + if (component instanceof TextInputBuilder) { + return new ActionRowBuilder().addComponents(component); + } + if ("type" in component) { + if (component.type === ComponentType23.ActionRow) { + return new ActionRowBuilder(component); + } + if (component.type === ComponentType23.Label) { + return new LabelBuilder(component); + } + if (component.type === ComponentType23.TextDisplay) { + return new TextDisplayBuilder(component); + } + if (component.type === ComponentType23.TextInput) { + return new ActionRowBuilder().addComponents( + new TextInputBuilder(component) + ); + } + } + throw new TypeError(`Invalid component passed in ModalBuilder.addComponents at index ${idx}!`); + }) ); return this; } + /** + * Adds label components to this modal. + * + * @param components - The components to add + */ + addLabelComponents(...components) { + const normalized = normalizeArray(components); + const resolved = normalized.map((label) => resolveBuilder(label, LabelBuilder)); + this.components.push(...resolved); + return this; + } + /** + * Adds text display components to this modal. + * + * @param components - The components to add + */ + addTextDisplayComponents(...components) { + const normalized = normalizeArray(components); + const resolved = normalized.map((row) => resolveBuilder(row, TextDisplayBuilder)); + this.components.push(...resolved); + return this; + } + /** + * Adds action rows to this modal. + * + * @param components - The components to add + * @deprecated Use {@link ModalBuilder.addLabelComponents} instead + */ + addActionRowComponents(...components) { + const normalized = normalizeArray(components); + const resolved = normalized.map((row) => resolveBuilder(row, ActionRowBuilder)); + this.components.push(...resolved); + return this; + } + /** + * Sets the labels for this modal. + * + * @param components - The components to set + */ + setLabelComponents(...components) { + const normalized = normalizeArray(components); + this.spliceLabelComponents(0, this.components.length, ...normalized); + return this; + } + /** + * Removes, replaces, or inserts labels for this modal. + * + * @remarks + * This method behaves similarly + * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}. + * The maximum amount of labels that can be added is 5. + * + * It's useful for modifying and adjusting order of the already-existing labels of a modal. + * @example + * Remove the first label: + * ```ts + * modal.spliceLabelComponents(0, 1); + * ``` + * @example + * Remove the first n labels: + * ```ts + * const n = 4; + * modal.spliceLabelComponents(0, n); + * ``` + * @example + * Remove the last label: + * ```ts + * modal.spliceLabelComponents(-1, 1); + * ``` + * @param index - The index to start at + * @param deleteCount - The number of labels to remove + * @param labels - The replacing label objects + */ + spliceLabelComponents(index, deleteCount, ...labels) { + const resolved = labels.map((label) => resolveBuilder(label, LabelBuilder)); + this.components.splice(index, deleteCount, ...resolved); + return this; + } /** * Sets components for this modal. * * @param components - The components to set + * @deprecated Use {@link ModalBuilder.setLabelComponents} instead */ setComponents(...components) { this.components.splice(0, this.components.length, ...normalizeArray(components)); @@ -2322,8 +2793,8 @@ var ModalBuilder = class { }; // src/interactions/slashCommands/Assertions.ts -var Assertions_exports6 = {}; -__export(Assertions_exports6, { +var Assertions_exports9 = {}; +__export(Assertions_exports9, { assertReturnOfBuilder: () => assertReturnOfBuilder2, contextsPredicate: () => contextsPredicate, integrationTypesPredicate: () => integrationTypesPredicate, @@ -2341,24 +2812,24 @@ __export(Assertions_exports6, { validateRequired: () => validateRequired, validateRequiredParameters: () => validateRequiredParameters3 }); -import { s as s6 } from "@sapphire/shapeshift"; +import { s as s9 } from "@sapphire/shapeshift"; import { ApplicationIntegrationType, InteractionContextType, Locale } from "discord-api-types/v10"; -var namePredicate = s6.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(32).regex(/^[\p{Ll}\p{Lm}\p{Lo}\p{N}\p{sc=Devanagari}\p{sc=Thai}_-]+$/u).setValidationEnabled(isValidationEnabled); +var namePredicate = s9.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 descriptionPredicate3 = s6.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled); -var localePredicate = s6.nativeEnum(Locale); +var descriptionPredicate3 = s9.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled); +var localePredicate = s9.nativeEnum(Locale); function validateDescription(description) { descriptionPredicate3.parse(description); } __name(validateDescription, "validateDescription"); -var maxArrayLengthPredicate = s6.unknown().array().lengthLessThanOrEqual(25).setValidationEnabled(isValidationEnabled); +var maxArrayLengthPredicate = s9.unknown().array().lengthLessThanOrEqual(25).setValidationEnabled(isValidationEnabled); function validateLocale(locale) { return localePredicate.parse(locale); } @@ -2373,7 +2844,7 @@ function validateRequiredParameters3(name, description, options) { validateMaxOptionsLength(options); } __name(validateRequiredParameters3, "validateRequiredParameters"); -var booleanPredicate = s6.boolean(); +var booleanPredicate = s9.boolean(); function validateDefaultPermission(value) { booleanPredicate.parse(value); } @@ -2382,29 +2853,29 @@ function validateRequired(required) { booleanPredicate.parse(required); } __name(validateRequired, "validateRequired"); -var choicesLengthPredicate = s6.number().lessThanOrEqual(25).setValidationEnabled(isValidationEnabled); +var choicesLengthPredicate = s9.number().lessThanOrEqual(25).setValidationEnabled(isValidationEnabled); function validateChoicesLength(amountAdding, choices) { choicesLengthPredicate.parse((choices?.length ?? 0) + amountAdding); } __name(validateChoicesLength, "validateChoicesLength"); function assertReturnOfBuilder2(input, ExpectedInstanceOf) { - s6.instance(ExpectedInstanceOf).parse(input); + s9.instance(ExpectedInstanceOf).parse(input); } __name(assertReturnOfBuilder2, "assertReturnOfBuilder"); -var localizationMapPredicate = s6.object(Object.fromEntries(Object.values(Locale).map((locale) => [locale, s6.string().nullish()]))).strict().nullish().setValidationEnabled(isValidationEnabled); +var localizationMapPredicate = s9.object(Object.fromEntries(Object.values(Locale).map((locale) => [locale, s9.string().nullish()]))).strict().nullish().setValidationEnabled(isValidationEnabled); function validateLocalizationMap(value) { localizationMapPredicate.parse(value); } __name(validateLocalizationMap, "validateLocalizationMap"); -var dmPermissionPredicate = s6.boolean().nullish(); +var dmPermissionPredicate = s9.boolean().nullish(); function validateDMPermission(value) { dmPermissionPredicate.parse(value); } __name(validateDMPermission, "validateDMPermission"); -var memberPermissionPredicate = s6.union([ - s6.bigint().transform((value) => value.toString()), - s6.number().safeInt().transform((value) => value.toString()), - s6.string().regex(/^\d+$/) +var memberPermissionPredicate = s9.union([ + s9.bigint().transform((value) => value.toString()), + s9.number().safeInt().transform((value) => value.toString()), + s9.string().regex(/^\d+$/) ]).nullish(); function validateDefaultMemberPermissions(permissions) { return memberPermissionPredicate.parse(permissions); @@ -2414,11 +2885,11 @@ function validateNSFW(value) { booleanPredicate.parse(value); } __name(validateNSFW, "validateNSFW"); -var contextsPredicate = s6.array( - s6.nativeEnum(InteractionContextType).setValidationEnabled(isValidationEnabled) +var contextsPredicate = s9.array( + s9.nativeEnum(InteractionContextType).setValidationEnabled(isValidationEnabled) ); -var integrationTypesPredicate = s6.array( - s6.nativeEnum(ApplicationIntegrationType).setValidationEnabled(isValidationEnabled) +var integrationTypesPredicate = s9.array( + s9.nativeEnum(ApplicationIntegrationType).setValidationEnabled(isValidationEnabled) ); // src/interactions/slashCommands/SlashCommandBuilder.ts @@ -2728,21 +3199,21 @@ import { ApplicationCommandOptionType as ApplicationCommandOptionType3 } from "d import { mix } from "ts-mixer"; // src/interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.ts -import { s as s7 } from "@sapphire/shapeshift"; -import { ChannelType as ChannelType2 } from "discord-api-types/v10"; +import { s as s10 } from "@sapphire/shapeshift"; +import { ChannelType as ChannelType3 } from "discord-api-types/v10"; var allowedChannelTypes = [ - ChannelType2.GuildText, - ChannelType2.GuildVoice, - ChannelType2.GuildCategory, - ChannelType2.GuildAnnouncement, - ChannelType2.AnnouncementThread, - ChannelType2.PublicThread, - ChannelType2.PrivateThread, - ChannelType2.GuildStageVoice, - ChannelType2.GuildForum, - ChannelType2.GuildMedia + ChannelType3.GuildText, + ChannelType3.GuildVoice, + ChannelType3.GuildCategory, + ChannelType3.GuildAnnouncement, + ChannelType3.AnnouncementThread, + ChannelType3.PublicThread, + ChannelType3.PrivateThread, + ChannelType3.GuildStageVoice, + ChannelType3.GuildForum, + ChannelType3.GuildMedia ]; -var channelTypesPredicate = s7.array(s7.union(allowedChannelTypes.map((type) => s7.literal(type)))); +var channelTypesPredicate = s10.array(s10.union(allowedChannelTypes.map((type) => s10.literal(type)))); var ApplicationCommandOptionChannelTypesMixin = class { static { __name(this, "ApplicationCommandOptionChannelTypesMixin"); @@ -2785,7 +3256,7 @@ SlashCommandChannelOption = __decorateClass([ ], SlashCommandChannelOption); // src/interactions/slashCommands/options/integer.ts -import { s as s10 } from "@sapphire/shapeshift"; +import { s as s13 } from "@sapphire/shapeshift"; import { ApplicationCommandOptionType as ApplicationCommandOptionType5 } from "discord-api-types/v10"; import { mix as mix2 } from "ts-mixer"; @@ -2805,8 +3276,8 @@ var ApplicationCommandNumericOptionMinMaxValueMixin = class { }; // src/interactions/slashCommands/mixins/ApplicationCommandOptionWithAutocompleteMixin.ts -import { s as s8 } from "@sapphire/shapeshift"; -var booleanPredicate2 = s8.boolean(); +import { s as s11 } from "@sapphire/shapeshift"; +var booleanPredicate2 = s11.boolean(); var ApplicationCommandOptionWithAutocompleteMixin = class { static { __name(this, "ApplicationCommandOptionWithAutocompleteMixin"); @@ -2837,14 +3308,14 @@ var ApplicationCommandOptionWithAutocompleteMixin = class { }; // src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesMixin.ts -import { s as s9 } from "@sapphire/shapeshift"; +import { s as s12 } from "@sapphire/shapeshift"; import { ApplicationCommandOptionType as ApplicationCommandOptionType4 } from "discord-api-types/v10"; -var stringPredicate = s9.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100); -var numberPredicate = s9.number().greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY); -var choicesPredicate = s9.object({ +var stringPredicate = s12.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100); +var numberPredicate = s12.number().greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY); +var choicesPredicate = s12.object({ name: stringPredicate, name_localizations: localizationMapPredicate, - value: s9.union([stringPredicate, numberPredicate]) + value: s12.union([stringPredicate, numberPredicate]) }).array(); var ApplicationCommandOptionWithChoicesMixin = class { static { @@ -2903,7 +3374,7 @@ var ApplicationCommandOptionWithChoicesMixin = class { }; // src/interactions/slashCommands/options/integer.ts -var numberValidator = s10.number().int(); +var numberValidator = s13.number().int(); var SlashCommandIntegerOption = class extends ApplicationCommandOptionBase { /** * The type of this option. @@ -2965,10 +3436,10 @@ var SlashCommandMentionableOption = class extends ApplicationCommandOptionBase { }; // src/interactions/slashCommands/options/number.ts -import { s as s11 } from "@sapphire/shapeshift"; +import { s as s14 } from "@sapphire/shapeshift"; import { ApplicationCommandOptionType as ApplicationCommandOptionType7 } from "discord-api-types/v10"; import { mix as mix3 } from "ts-mixer"; -var numberValidator2 = s11.number(); +var numberValidator2 = s14.number(); var SlashCommandNumberOption = class extends ApplicationCommandOptionBase { /** * The type of this option. @@ -3030,11 +3501,11 @@ var SlashCommandRoleOption = class extends ApplicationCommandOptionBase { }; // src/interactions/slashCommands/options/string.ts -import { s as s12 } from "@sapphire/shapeshift"; +import { s as s15 } from "@sapphire/shapeshift"; import { ApplicationCommandOptionType as ApplicationCommandOptionType9 } from "discord-api-types/v10"; import { mix as mix4 } from "ts-mixer"; -var minLengthValidator2 = s12.number().greaterThanOrEqual(0).lessThanOrEqual(6e3); -var maxLengthValidator2 = s12.number().greaterThanOrEqual(1).lessThanOrEqual(6e3); +var minLengthValidator2 = s15.number().greaterThanOrEqual(0).lessThanOrEqual(6e3); +var maxLengthValidator2 = s15.number().greaterThanOrEqual(1).lessThanOrEqual(6e3); var SlashCommandStringOption = class extends ApplicationCommandOptionBase { /** * The type of this option. @@ -3383,8 +3854,8 @@ SlashCommandBuilder = __decorateClass([ ], SlashCommandBuilder); // src/interactions/contextMenuCommands/Assertions.ts -var Assertions_exports7 = {}; -__export(Assertions_exports7, { +var Assertions_exports10 = {}; +__export(Assertions_exports10, { contextsPredicate: () => contextsPredicate2, integrationTypesPredicate: () => integrationTypesPredicate2, validateDMPermission: () => validateDMPermission2, @@ -3394,11 +3865,11 @@ __export(Assertions_exports7, { validateRequiredParameters: () => validateRequiredParameters4, validateType: () => validateType }); -import { s as s13 } from "@sapphire/shapeshift"; +import { s as s16 } from "@sapphire/shapeshift"; import { ApplicationCommandType as ApplicationCommandType2, ApplicationIntegrationType as ApplicationIntegrationType2, InteractionContextType as InteractionContextType2 } from "discord-api-types/v10"; -var namePredicate2 = s13.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(32).regex(/\S/).setValidationEnabled(isValidationEnabled); -var typePredicate = s13.union([s13.literal(ApplicationCommandType2.User), s13.literal(ApplicationCommandType2.Message)]).setValidationEnabled(isValidationEnabled); -var booleanPredicate3 = s13.boolean(); +var namePredicate2 = s16.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(32).regex(/\S/).setValidationEnabled(isValidationEnabled); +var typePredicate = s16.union([s16.literal(ApplicationCommandType2.User), s16.literal(ApplicationCommandType2.Message)]).setValidationEnabled(isValidationEnabled); +var booleanPredicate3 = s16.boolean(); function validateDefaultPermission2(value) { booleanPredicate3.parse(value); } @@ -3416,25 +3887,25 @@ function validateRequiredParameters4(name, type) { validateType(type); } __name(validateRequiredParameters4, "validateRequiredParameters"); -var dmPermissionPredicate2 = s13.boolean().nullish(); +var dmPermissionPredicate2 = s16.boolean().nullish(); function validateDMPermission2(value) { dmPermissionPredicate2.parse(value); } __name(validateDMPermission2, "validateDMPermission"); -var memberPermissionPredicate2 = s13.union([ - s13.bigint().transform((value) => value.toString()), - s13.number().safeInt().transform((value) => value.toString()), - s13.string().regex(/^\d+$/) +var memberPermissionPredicate2 = s16.union([ + s16.bigint().transform((value) => value.toString()), + s16.number().safeInt().transform((value) => value.toString()), + s16.string().regex(/^\d+$/) ]).nullish(); function validateDefaultMemberPermissions2(permissions) { return memberPermissionPredicate2.parse(permissions); } __name(validateDefaultMemberPermissions2, "validateDefaultMemberPermissions"); -var contextsPredicate2 = s13.array( - s13.nativeEnum(InteractionContextType2).setValidationEnabled(isValidationEnabled) +var contextsPredicate2 = s16.array( + s16.nativeEnum(InteractionContextType2).setValidationEnabled(isValidationEnabled) ); -var integrationTypesPredicate2 = s13.array( - s13.nativeEnum(ApplicationIntegrationType2).setValidationEnabled(isValidationEnabled) +var integrationTypesPredicate2 = s16.array( + s16.nativeEnum(ApplicationIntegrationType2).setValidationEnabled(isValidationEnabled) ); // src/interactions/contextMenuCommands/ContextMenuCommandBuilder.ts @@ -3615,7 +4086,7 @@ function embedLength(data) { __name(embedLength, "embedLength"); // src/index.ts -var version = "1.11.3"; +var version = "1.13.1"; export { ActionRowBuilder, ApplicationCommandNumericOptionMinMaxValueMixin, @@ -3628,20 +4099,25 @@ export { ChannelSelectMenuBuilder, Assertions_exports2 as ComponentAssertions, ComponentBuilder, - Assertions_exports4 as ComponentsV2Assertions, + Assertions_exports7 as ComponentsV2Assertions, ContainerBuilder, - Assertions_exports7 as ContextMenuCommandAssertions, + Assertions_exports10 as ContextMenuCommandAssertions, ContextMenuCommandBuilder, Assertions_exports as EmbedAssertions, EmbedBuilder, FileBuilder, + Assertions_exports3 as FileUploadAssertions, + FileUploadBuilder, + Assertions_exports6 as LabelAssertions, + LabelBuilder, MediaGalleryBuilder, MediaGalleryItemBuilder, MentionableSelectMenuBuilder, - Assertions_exports5 as ModalAssertions, + Assertions_exports8 as ModalAssertions, ModalBuilder, RoleSelectMenuBuilder, SectionBuilder, + Assertions_exports5 as SelectMenuAssertions, StringSelectMenuBuilder as SelectMenuBuilder, StringSelectMenuOptionBuilder as SelectMenuOptionBuilder, SeparatorBuilder, @@ -3649,7 +4125,7 @@ export { SharedSlashCommand, SharedSlashCommandOptions, SharedSlashCommandSubcommands, - Assertions_exports6 as SlashCommandAssertions, + Assertions_exports9 as SlashCommandAssertions, SlashCommandAttachmentOption, SlashCommandBooleanOption, SlashCommandBuilder, @@ -3665,7 +4141,7 @@ export { StringSelectMenuBuilder, StringSelectMenuOptionBuilder, TextDisplayBuilder, - Assertions_exports3 as TextInputAssertions, + Assertions_exports4 as TextInputAssertions, TextInputBuilder, ThumbnailBuilder, UserSelectMenuBuilder, diff --git a/node_modules/@discordjs/builders/dist/index.mjs.map b/node_modules/@discordjs/builders/dist/index.mjs.map index 58b2ce3..5280271 100644 --- a/node_modules/@discordjs/builders/dist/index.mjs.map +++ b/node_modules/@discordjs/builders/dist/index.mjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/messages/embed/Assertions.ts","../src/util/validation.ts","../src/util/normalizeArray.ts","../src/messages/embed/Embed.ts","../src/index.ts","../src/components/Assertions.ts","../src/components/selectMenu/StringSelectMenuOption.ts","../src/components/ActionRow.ts","../src/components/Component.ts","../src/components/Components.ts","../src/components/button/Button.ts","../src/components/selectMenu/ChannelSelectMenu.ts","../src/components/selectMenu/BaseSelectMenu.ts","../src/components/selectMenu/MentionableSelectMenu.ts","../src/components/selectMenu/RoleSelectMenu.ts","../src/components/selectMenu/StringSelectMenu.ts","../src/components/selectMenu/UserSelectMenu.ts","../src/components/textInput/TextInput.ts","../src/components/textInput/Assertions.ts","../src/components/v2/Container.ts","../src/components/v2/Assertions.ts","../src/components/v2/Thumbnail.ts","../src/components/v2/File.ts","../src/components/v2/Separator.ts","../src/components/v2/TextDisplay.ts","../src/components/v2/MediaGallery.ts","../src/components/v2/MediaGalleryItem.ts","../src/components/v2/Section.ts","../src/interactions/modals/Assertions.ts","../src/interactions/modals/Modal.ts","../src/interactions/slashCommands/Assertions.ts","../src/interactions/slashCommands/SlashCommandBuilder.ts","../src/interactions/slashCommands/mixins/NameAndDescription.ts","../src/interactions/slashCommands/mixins/SharedSlashCommand.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/ApplicationCommandOptionWithAutocompleteMixin.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesMixin.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/slashCommands/SlashCommandSubcommands.ts","../src/interactions/slashCommands/mixins/SharedSubcommands.ts","../src/interactions/contextMenuCommands/Assertions.ts","../src/interactions/contextMenuCommands/ContextMenuCommandBuilder.ts","../src/util/componentUtil.ts"],"sourcesContent":["import { s } from '@sapphire/shapeshift';\nimport type { APIEmbedField } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\n\nexport const fieldNamePredicate = s.string().lengthLessThanOrEqual(256).setValidationEnabled(isValidationEnabled);\n\nexport const fieldValuePredicate = s.string().lengthLessThanOrEqual(1_024).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\n\t.lengthGreaterThanOrEqual(1)\n\t.nullable()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const imageURLPredicate = s\n\t.string()\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:', 'attachment:'],\n\t})\n\t.nullish()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const urlPredicate = s\n\t.string()\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:'],\n\t})\n\t.nullish()\n\t.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\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(255)\n\t.setValidationEnabled(isValidationEnabled);\nexport const colorPredicate = s\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(0xffffff)\n\t.or(s.tuple([RGBPredicate, RGBPredicate, RGBPredicate]))\n\t.nullable()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const descriptionPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(4_096)\n\t.nullable()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const footerTextPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(2_048)\n\t.nullable()\n\t.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\n\t.lengthGreaterThanOrEqual(1)\n\t.nullable()\n\t.setValidationEnabled(isValidationEnabled);\n","let validate = true;\n\n/**\n * Enables validators.\n *\n * @returns Whether validation is occurring.\n */\nexport function enableValidators() {\n\treturn (validate = true);\n}\n\n/**\n * Disables validators.\n *\n * @returns Whether validation is occurring.\n */\nexport function disableValidators() {\n\treturn (validate = false);\n}\n\n/**\n * Checks whether validation is occurring.\n */\nexport function isValidationEnabled() {\n\treturn validate;\n}\n","/**\n * Normalizes data that is a rest parameter or an array into an array with a depth of 1.\n *\n * @typeParam ItemType - The data that must satisfy {@link RestOrArray}.\n * @param arr - The (possibly variadic) data to normalize\n */\nexport function normalizeArray(arr: RestOrArray): ItemType[] {\n\tif (Array.isArray(arr[0])) return [...arr[0]];\n\treturn arr as ItemType[];\n}\n\n/**\n * Represents data that may be an array or came from a rest parameter.\n *\n * @remarks\n * This type is used throughout builders to ensure both an array and variadic arguments\n * may be used. It is normalized with {@link normalizeArray}.\n */\nexport type RestOrArray = Type[] | [Type[]];\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\n/**\n * A tuple satisfying the RGB color model.\n *\n * @see {@link https://developer.mozilla.org/docs/Glossary/RGB}\n */\nexport type RGBTuple = [red: number, green: number, blue: number];\n\n/**\n * The base icon data typically used in payloads.\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\n/**\n * Represents the author data of an embed.\n */\nexport interface EmbedAuthorData extends IconData, Omit {}\n\n/**\n * Represents the author options of an embed.\n */\nexport interface EmbedAuthorOptions extends Omit {}\n\n/**\n * Represents the footer data of an embed.\n */\nexport interface EmbedFooterData extends IconData, Omit {}\n\n/**\n * Represents the footer options of an embed.\n */\nexport interface EmbedFooterOptions extends Omit {}\n\n/**\n * Represents the image data of an embed.\n */\nexport interface EmbedImageData extends Omit {\n\t/**\n\t * The proxy URL for the image.\n\t */\n\tproxyURL?: string;\n}\n\n/**\n * A builder that creates API-compatible JSON data for embeds.\n */\nexport class EmbedBuilder {\n\t/**\n\t * The API data associated with this embed.\n\t */\n\tpublic readonly data: APIEmbed;\n\n\t/**\n\t * Creates a new embed from API data.\n\t *\n\t * @param data - The API data to create this embed with\n\t */\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\tconst normalizedFields = normalizeArray(fields);\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(normalizedFields.length, this.data.fields);\n\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(normalizedFields);\n\n\t\tif (this.data.fields) this.data.fields.push(...normalizedFields);\n\t\telse this.data.fields = normalizedFields;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts fields for this embed.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t * The maximum amount of fields that can be added is 25.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing fields of an embed.\n\t * @example\n\t * Remove the first field:\n\t * ```ts\n\t * embed.spliceFields(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n fields:\n\t * ```ts\n\t * const n = 4;\n\t * embed.spliceFields(0, n);\n\t * ```\n\t * @example\n\t * Remove the last field:\n\t * ```ts\n\t * embed.spliceFields(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of fields to remove\n\t * @param fields - The replacing field objects\n\t */\n\tpublic spliceFields(index: number, deleteCount: number, ...fields: APIEmbedField[]): this {\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(fields.length - deleteCount, this.data.fields);\n\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(fields);\n\t\tif (this.data.fields) this.data.fields.splice(index, deleteCount, ...fields);\n\t\telse this.data.fields = fields;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the fields for this embed.\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): this {\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 to use\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 to use\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 to use\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 footer to use\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 image URL to use\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 thumbnail URL to use\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 to use\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 for this embed.\n\t *\n\t * @param title - The title to use\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 to use\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 * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIEmbed {\n\t\treturn { ...this.data };\n\t}\n}\n","export * as EmbedAssertions from './messages/embed/Assertions.js';\nexport * from './messages/embed/Embed.js';\n// TODO: Consider removing this dep in the next major version\nexport * from '@discordjs/formatters';\n\nexport * as ComponentAssertions from './components/Assertions.js';\nexport * from './components/ActionRow.js';\nexport * from './components/button/Button.js';\nexport * from './components/Component.js';\nexport * from './components/Components.js';\nexport * from './components/textInput/TextInput.js';\nexport * as TextInputAssertions from './components/textInput/Assertions.js';\nexport * from './interactions/modals/Modal.js';\nexport * as ModalAssertions from './interactions/modals/Assertions.js';\n\nexport * from './components/selectMenu/BaseSelectMenu.js';\nexport * from './components/selectMenu/ChannelSelectMenu.js';\nexport * from './components/selectMenu/MentionableSelectMenu.js';\nexport * from './components/selectMenu/RoleSelectMenu.js';\nexport * from './components/selectMenu/StringSelectMenu.js';\n// TODO: Remove those aliases in v2\nexport {\n\t/**\n\t * @deprecated Will be removed in the next major version, use {@link StringSelectMenuBuilder} instead.\n\t */\n\tStringSelectMenuBuilder as SelectMenuBuilder,\n} from './components/selectMenu/StringSelectMenu.js';\nexport {\n\t/**\n\t * @deprecated Will be removed in the next major version, use {@link StringSelectMenuOptionBuilder} instead.\n\t */\n\tStringSelectMenuOptionBuilder as SelectMenuOptionBuilder,\n} from './components/selectMenu/StringSelectMenuOption.js';\nexport * from './components/selectMenu/StringSelectMenuOption.js';\nexport * from './components/selectMenu/UserSelectMenu.js';\n\nexport * as ComponentsV2Assertions from './components/v2/Assertions.js';\nexport * from './components/v2/Container.js';\nexport * from './components/v2/File.js';\nexport * from './components/v2/MediaGallery.js';\nexport * from './components/v2/MediaGalleryItem.js';\nexport * from './components/v2/Section.js';\nexport * from './components/v2/Separator.js';\nexport * from './components/v2/TextDisplay.js';\nexport * from './components/v2/Thumbnail.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/ApplicationCommandOptionWithAutocompleteMixin.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesMixin.js';\nexport * from './interactions/slashCommands/mixins/NameAndDescription.js';\nexport * from './interactions/slashCommands/mixins/SharedSlashCommandOptions.js';\nexport * from './interactions/slashCommands/mixins/SharedSubcommands.js';\nexport * from './interactions/slashCommands/mixins/SharedSlashCommand.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';\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 * @privateRemarks This needs to explicitly be `string` so it is not typed as a \"const string\" that gets injected by esbuild.\n */\nexport const version = '1.11.3' as string;\n","import { s } from '@sapphire/shapeshift';\nimport { ButtonStyle, ChannelType, type APIMessageComponentEmoji } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../util/validation.js';\nimport { StringSelectMenuOptionBuilder } from './selectMenu/StringSelectMenuOption.js';\n\nexport const idValidator = s\n\t.number()\n\t.safeInt()\n\t.greaterThanOrEqual(1)\n\t.lessThan(4_294_967_296) // 2^32 - 1\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const customIdValidator = s\n\t.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()\n\t.strict()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const disabledValidator = s.boolean();\n\nexport const buttonLabelValidator = s\n\t.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\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(25)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const labelValueDescriptionValidator = s\n\t.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\n\t.array()\n\t.lengthGreaterThanOrEqual(0)\n\t.setValidationEnabled(isValidationEnabled);\nexport const optionsLengthValidator = s\n\t.number()\n\t.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\n\t.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\tskuId?: string,\n\turl?: string,\n) {\n\tif (style === ButtonStyle.Premium) {\n\t\tif (!skuId) {\n\t\t\tthrow new RangeError('Premium buttons must have an SKU id.');\n\t\t}\n\n\t\tif (customId || label || url || emoji) {\n\t\t\tthrow new RangeError('Premium buttons cannot have a custom id, label, URL, or emoji.');\n\t\t}\n\t} else {\n\t\tif (skuId) {\n\t\t\tthrow new RangeError('Non-premium buttons must not have an SKU id.');\n\t\t}\n\n\t\tif (url && customId) {\n\t\t\tthrow new RangeError('URL and custom id are mutually exclusive.');\n\t\t}\n\n\t\tif (!label && !emoji) {\n\t\t\tthrow new RangeError('Non-premium buttons must have a label and/or an emoji.');\n\t\t}\n\n\t\tif (style === ButtonStyle.Link) {\n\t\t\tif (!url) {\n\t\t\t\tthrow new RangeError('Link buttons must have a URL.');\n\t\t\t}\n\t\t} else if (url) {\n\t\t\tthrow new RangeError('Non-premium and non-link buttons cannot have a URL.');\n\t\t}\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 * A builder that creates API-compatible JSON data for string select menu options.\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 for this option.\n\t *\n\t * @param label - The label to use\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 for this option.\n\t *\n\t * @param value - The value to use\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 for this option.\n\t *\n\t * @param description - The description to use\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 for this option.\n\t *\n\t * @param emoji - The emoji to use\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 BaseSelectMenuBuilder.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 APIComponentInMessageActionRow,\n\ttype APIComponentInModalActionRow,\n\ttype APIComponentInActionRow,\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\n/**\n * The builders that may be used for modals.\n */\nexport type ModalComponentBuilder = ActionRowBuilder | ModalActionRowComponentBuilder;\n\n/**\n * The builders that may be used within an action row for messages.\n */\nexport type MessageActionRowComponentBuilder =\n\t| ButtonBuilder\n\t| ChannelSelectMenuBuilder\n\t| MentionableSelectMenuBuilder\n\t| RoleSelectMenuBuilder\n\t| StringSelectMenuBuilder\n\t| UserSelectMenuBuilder;\n\n/**\n * The builders that may be used within an action row for modals.\n */\nexport type ModalActionRowComponentBuilder = TextInputBuilder;\n\n/**\n * Any builder.\n */\nexport type AnyComponentBuilder = MessageActionRowComponentBuilder | ModalActionRowComponentBuilder;\n\n/**\n * A builder that creates API-compatible JSON data for action rows.\n *\n * @typeParam ComponentType - 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: ComponentType[];\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 ComponentType[];\n\t}\n\n\t/**\n\t * Adds components to this action row.\n\t *\n\t * @param components - The components to add\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 components for this action row.\n\t *\n\t * @param components - The components to set\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\tAPIComponentInActionRow,\n\tAPIBaseComponent,\n\tComponentType,\n\tAPIMessageComponent,\n} from 'discord-api-types/v10';\nimport { idValidator } from './Assertions';\n\n/**\n * Any action row component data represented as an object.\n */\nexport type AnyAPIActionRowComponent =\n\t| APIActionRowComponent\n\t| APIComponentInActionRow\n\t| APIMessageComponent;\n\n/**\n * The base component builder that contains common symbols for all sorts of components.\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 builder to API-compatible JSON data.\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\t/**\n\t * Constructs a new kind of component.\n\t *\n\t * @param data - The data to construct a component out of\n\t */\n\tpublic constructor(data: Partial) {\n\t\tthis.data = data;\n\t}\n\n\t/**\n\t * Sets the id (not the custom id) for this component.\n\t *\n\t * @param id - The id for this component\n\t */\n\tpublic setId(id: number) {\n\t\tthis.data.id = idValidator.parse(id);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the id of this component, defaulting to a default incremented id.\n\t */\n\tpublic clearId() {\n\t\tthis.data.id = undefined;\n\t\treturn this;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport { ComponentType, type APIMessageComponent, type APIModalComponent } from 'discord-api-types/v10';\nimport {\n\tActionRowBuilder,\n\ttype MessageActionRowComponentBuilder,\n\ttype AnyComponentBuilder,\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';\nimport { ContainerBuilder } from './v2/Container.js';\nimport { FileBuilder } from './v2/File.js';\nimport { MediaGalleryBuilder } from './v2/MediaGallery.js';\nimport { SectionBuilder } from './v2/Section.js';\nimport { SeparatorBuilder } from './v2/Separator.js';\nimport { TextDisplayBuilder } from './v2/TextDisplay.js';\nimport { ThumbnailBuilder } from './v2/Thumbnail.js';\n\n/**\n * The builders that may be used for messages.\n */\nexport type MessageComponentBuilder =\n\t| ActionRowBuilder\n\t| ContainerBuilder\n\t| FileBuilder\n\t| MediaGalleryBuilder\n\t| MessageActionRowComponentBuilder\n\t| SectionBuilder\n\t| SeparatorBuilder\n\t| TextDisplayBuilder\n\t| ThumbnailBuilder;\n\n/**\n * Components here are mapped to their respective builder.\n */\nexport interface MappedComponentTypes {\n\t/**\n\t * The action row component type is associated with an {@link ActionRowBuilder}.\n\t */\n\t[ComponentType.ActionRow]: ActionRowBuilder;\n\t/**\n\t * The button component type is associated with a {@link ButtonBuilder}.\n\t */\n\t[ComponentType.Button]: ButtonBuilder;\n\t/**\n\t * The string select component type is associated with a {@link StringSelectMenuBuilder}.\n\t */\n\t[ComponentType.StringSelect]: StringSelectMenuBuilder;\n\t/**\n\t * The text input component type is associated with a {@link TextInputBuilder}.\n\t */\n\t[ComponentType.TextInput]: TextInputBuilder;\n\t/**\n\t * The user select component type is associated with a {@link UserSelectMenuBuilder}.\n\t */\n\t[ComponentType.UserSelect]: UserSelectMenuBuilder;\n\t/**\n\t * The role select component type is associated with a {@link RoleSelectMenuBuilder}.\n\t */\n\t[ComponentType.RoleSelect]: RoleSelectMenuBuilder;\n\t/**\n\t * The mentionable select component type is associated with a {@link MentionableSelectMenuBuilder}.\n\t */\n\t[ComponentType.MentionableSelect]: MentionableSelectMenuBuilder;\n\t/**\n\t * The channel select component type is associated with a {@link ChannelSelectMenuBuilder}.\n\t */\n\t[ComponentType.ChannelSelect]: ChannelSelectMenuBuilder;\n\t/**\n\t * The file component type is associated with a {@link FileBuilder}.\n\t */\n\t[ComponentType.File]: FileBuilder;\n\t/**\n\t * The separator component type is associated with a {@link SeparatorBuilder}.\n\t */\n\t[ComponentType.Separator]: SeparatorBuilder;\n\t/**\n\t * The container component type is associated with a {@link ContainerBuilder}.\n\t */\n\t[ComponentType.Container]: ContainerBuilder;\n\t/**\n\t * The text display component type is associated with a {@link TextDisplayBuilder}.\n\t */\n\t[ComponentType.TextDisplay]: TextDisplayBuilder;\n\t/**\n\t * The thumbnail component type is associated with a {@link ThumbnailBuilder}.\n\t */\n\t[ComponentType.Thumbnail]: ThumbnailBuilder;\n\t/**\n\t * The section component type is associated with a {@link SectionBuilder}.\n\t */\n\t[ComponentType.Section]: SectionBuilder;\n\t/**\n\t * The media gallery component type is associated with a {@link MediaGalleryBuilder}.\n\t */\n\t[ComponentType.MediaGallery]: MediaGalleryBuilder;\n}\n\n/**\n * Factory for creating components from API data.\n *\n * @typeParam ComponentType - The type of component to use\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-constituents\n\tdata: (APIModalComponent | APIMessageComponent) & { type: ComponentType },\n): MappedComponentTypes[ComponentType];\n\n/**\n * Factory for creating components from API data.\n *\n * @typeParam ComponentBuilder - The type of component to use\n * @param data - The API data to transform to a component class\n */\nexport function createComponentBuilder(\n\tdata: ComponentBuilder,\n): ComponentBuilder;\n\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\tcase ComponentType.File:\n\t\t\treturn new FileBuilder(data);\n\t\tcase ComponentType.Container:\n\t\t\treturn new ContainerBuilder(data);\n\t\tcase ComponentType.Section:\n\t\t\treturn new SectionBuilder(data);\n\t\tcase ComponentType.Separator:\n\t\t\treturn new SeparatorBuilder(data);\n\t\tcase ComponentType.TextDisplay:\n\t\t\treturn new TextDisplayBuilder(data);\n\t\tcase ComponentType.Thumbnail:\n\t\t\treturn new ThumbnailBuilder(data);\n\t\tcase ComponentType.MediaGallery:\n\t\t\treturn new MediaGalleryBuilder(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\nfunction isBuilder>(\n\tbuilder: unknown,\n\tConstructor: new () => Builder,\n): builder is Builder {\n\treturn builder instanceof Constructor;\n}\n\nexport function resolveBuilder, Builder extends JSONEncodable>(\n\tbuilder: Builder | ComponentType | ((builder: Builder) => Builder),\n\tConstructor: new (data?: ComponentType) => Builder,\n) {\n\tif (isBuilder(builder, Constructor)) {\n\t\treturn builder;\n\t}\n\n\tif (typeof builder === 'function') {\n\t\treturn builder(new Constructor());\n\t}\n\n\treturn new Constructor(builder);\n}\n","import {\n\tComponentType,\n\ttype APIButtonComponent,\n\ttype APIButtonComponentWithCustomId,\n\ttype APIButtonComponentWithSKUId,\n\ttype APIButtonComponentWithURL,\n\ttype APIMessageComponentEmoji,\n\ttype ButtonStyle,\n\ttype Snowflake,\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 * A builder that creates API-compatible JSON data for buttons.\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 to use\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 use\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\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 SKU id that represents a purchasable SKU for this button.\n\t *\n\t * @remarks Only available when using premium-style buttons.\n\t * @param skuId - The SKU id to use\n\t */\n\tpublic setSKUId(skuId: Snowflake) {\n\t\t(this.data as APIButtonComponentWithSKUId).sku_id = skuId;\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 use\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\t(this.data as Exclude).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 use\n\t */\n\tpublic setLabel(label: string) {\n\t\t(this.data as Exclude).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\t(this.data as Exclude).label,\n\t\t\t(this.data as Exclude).emoji,\n\t\t\t(this.data as APIButtonComponentWithCustomId).custom_id,\n\t\t\t(this.data as APIButtonComponentWithSKUId).sku_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 {\n\ttype APIChannelSelectComponent,\n\ttype ChannelType,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { channelTypesValidator, customIdValidator, optionsLengthValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for channel select menus.\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\t/**\n\t * Adds channel types to this select menu.\n\t *\n\t * @param types - The channel types to use\n\t */\n\tpublic addChannelTypes(...types: RestOrArray) {\n\t\tconst normalizedTypes = normalizeArray(types);\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.push(...channelTypesValidator.parse(normalizedTypes));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets channel types for this select menu.\n\t *\n\t * @param types - The channel types to use\n\t */\n\tpublic setChannelTypes(...types: RestOrArray) {\n\t\tconst normalizedTypes = normalizeArray(types);\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.splice(0, this.data.channel_types.length, ...channelTypesValidator.parse(normalizedTypes));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default channels to this auto populated select menu.\n\t *\n\t * @param channels - The channels to add\n\t */\n\tpublic addDefaultChannels(...channels: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(channels);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Channel as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default channels for this auto populated select menu.\n\t *\n\t * @param channels - The channels to set\n\t */\n\tpublic setDefaultChannels(...channels: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(channels);\n\t\toptionsLengthValidator.parse(normalizedValues.length);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.Channel as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc BaseSelectMenuBuilder.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\n/**\n * The base select menu builder that contains common symbols for select menu builders.\n *\n * @typeParam SelectMenuType - The type of select menu this would be instantiated for.\n */\nexport abstract 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\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\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\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\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 {\n\ttype APIMentionableSelectComponent,\n\ttype APISelectMenuDefaultValue,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { optionsLengthValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for mentionable select menus.\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\t/**\n\t * Adds default roles to this auto populated select menu.\n\t *\n\t * @param roles - The roles to add\n\t */\n\tpublic addDefaultRoles(...roles: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default users to this auto populated select menu.\n\t *\n\t * @param users - The users to add\n\t */\n\tpublic addDefaultUsers(...users: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(users);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default values to this auto populated select menu.\n\t *\n\t * @param values - The values to add\n\t */\n\tpublic addDefaultValues(\n\t\t...values: RestOrArray<\n\t\t\t| APISelectMenuDefaultValue\n\t\t\t| APISelectMenuDefaultValue\n\t\t>\n\t) {\n\t\tconst normalizedValues = normalizeArray(values);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\t\tthis.data.default_values.push(...normalizedValues);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default values for this auto populated select menu.\n\t *\n\t * @param values - The values to set\n\t */\n\tpublic setDefaultValues(\n\t\t...values: RestOrArray<\n\t\t\t| APISelectMenuDefaultValue\n\t\t\t| APISelectMenuDefaultValue\n\t\t>\n\t) {\n\t\tconst normalizedValues = normalizeArray(values);\n\t\toptionsLengthValidator.parse(normalizedValues.length);\n\t\tthis.data.default_values = normalizedValues;\n\t\treturn this;\n\t}\n}\n","import {\n\ttype APIRoleSelectComponent,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { optionsLengthValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for role select menus.\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\t/**\n\t * Adds default roles to this auto populated select menu.\n\t *\n\t * @param roles - The roles to add\n\t */\n\tpublic addDefaultRoles(...roles: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default roles for this auto populated select menu.\n\t *\n\t * @param roles - The roles to set\n\t */\n\tpublic setDefaultRoles(...roles: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\t\toptionsLengthValidator.parse(normalizedValues.length);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n}\n","import { ComponentType } from 'discord-api-types/v10';\nimport type { APIStringSelectComponent, 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 * A builder that creates API-compatible JSON data for string select menus.\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\n\t */\n\tpublic addOptions(...options: RestOrArray) {\n\t\tconst normalizedOptions = normalizeArray(options);\n\t\toptionsLengthValidator.parse(this.options.length + normalizedOptions.length);\n\t\tthis.options.push(\n\t\t\t...normalizedOptions.map((normalizedOption) =>\n\t\t\t\tnormalizedOption instanceof StringSelectMenuOptionBuilder\n\t\t\t\t\t? normalizedOption\n\t\t\t\t\t: new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(normalizedOption)),\n\t\t\t),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the options for this select menu.\n\t *\n\t * @param options - The options to set\n\t */\n\tpublic setOptions(...options: RestOrArray) {\n\t\treturn this.spliceOptions(0, this.options.length, ...options);\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts options for this select menu.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | Array.prototype.splice()}.\n\t * It's useful for modifying and adjusting the order of existing options.\n\t * @example\n\t * Remove the first option:\n\t * ```ts\n\t * selectMenu.spliceOptions(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n option:\n\t * ```ts\n\t * const n = 4;\n\t * selectMenu.spliceOptions(0, n);\n\t * ```\n\t * @example\n\t * Remove the last option:\n\t * ```ts\n\t * selectMenu.spliceOptions(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of options to remove\n\t * @param options - The replacing option objects or builders\n\t */\n\tpublic spliceOptions(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...options: RestOrArray\n\t) {\n\t\tconst normalizedOptions = normalizeArray(options);\n\n\t\tconst clone = [...this.options];\n\n\t\tclone.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...normalizedOptions.map((normalizedOption) =>\n\t\t\t\tnormalizedOption instanceof StringSelectMenuOptionBuilder\n\t\t\t\t\t? normalizedOption\n\t\t\t\t\t: new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(normalizedOption)),\n\t\t\t),\n\t\t);\n\n\t\toptionsLengthValidator.parse(clone.length);\n\t\tthis.options.splice(0, this.options.length, ...clone);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc BaseSelectMenuBuilder.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 {\n\ttype APIUserSelectComponent,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { optionsLengthValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for user select menus.\n */\nexport class UserSelectMenuBuilder extends BaseSelectMenuBuilder {\n\t/**\n\t * Creates a new select menu from API data.\n\t *\n\t * @param data - The API data to create this select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new UserSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new UserSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1);\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ ...data, type: ComponentType.UserSelect });\n\t}\n\n\t/**\n\t * Adds default users to this auto populated select menu.\n\t *\n\t * @param users - The users to add\n\t */\n\tpublic addDefaultUsers(...users: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(users);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default users for this auto populated select menu.\n\t *\n\t * @param users - The users to set\n\t */\n\tpublic setDefaultUsers(...users: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(users);\n\t\toptionsLengthValidator.parse(normalizedValues.length);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n}\n","import { isJSONEncodable, type Equatable, type JSONEncodable } from '@discordjs/util';\nimport { ComponentType, type TextInputStyle, type APITextInputComponent } from 'discord-api-types/v10';\nimport isEqual from 'fast-deep-equal';\nimport { customIdValidator } from '../Assertions.js';\nimport { ComponentBuilder } from '../Component.js';\nimport {\n\tmaxLengthValidator,\n\tminLengthValidator,\n\tplaceholderValidator,\n\trequiredValidator,\n\tvalueValidator,\n\tvalidateRequiredParameters,\n\tlabelValidator,\n\ttextInputStyleValidator,\n} from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for text inputs.\n */\nexport class TextInputBuilder\n\textends ComponentBuilder\n\timplements Equatable>\n{\n\t/**\n\t * Creates a new text input from API data.\n\t *\n\t * @param data - The API data to create this text input with\n\t * @example\n\t * Creating a text input from an API data object:\n\t * ```ts\n\t * const textInput = new TextInputBuilder({\n\t * \tcustom_id: 'a cool text input',\n\t * \tlabel: 'Type something',\n\t * \tstyle: TextInputStyle.Short,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a text input using setters and API data:\n\t * ```ts\n\t * const textInput = new TextInputBuilder({\n\t * \tlabel: 'Type something else',\n\t * })\n\t * \t.setCustomId('woah')\n\t * \t.setStyle(TextInputStyle.Paragraph);\n\t * ```\n\t */\n\tpublic constructor(data?: APITextInputComponent & { type?: ComponentType.TextInput }) {\n\t\tsuper({ type: ComponentType.TextInput, ...data });\n\t}\n\n\t/**\n\t * Sets the custom id for this text input.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the label for this text input.\n\t *\n\t * @param label - The label to use\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = labelValidator.parse(label);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the style for this text input.\n\t *\n\t * @param style - The style to use\n\t */\n\tpublic setStyle(style: TextInputStyle) {\n\t\tthis.data.style = textInputStyleValidator.parse(style);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum length of text for this text input.\n\t *\n\t * @param minLength - The minimum length of text for this text input\n\t */\n\tpublic setMinLength(minLength: number) {\n\t\tthis.data.min_length = minLengthValidator.parse(minLength);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum length of text for this text input.\n\t *\n\t * @param maxLength - The maximum length of text for this text input\n\t */\n\tpublic setMaxLength(maxLength: number) {\n\t\tthis.data.max_length = maxLengthValidator.parse(maxLength);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the placeholder for this text input.\n\t *\n\t * @param placeholder - The placeholder to use\n\t */\n\tpublic setPlaceholder(placeholder: string) {\n\t\tthis.data.placeholder = placeholderValidator.parse(placeholder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value for this text input.\n\t *\n\t * @param value - The value to use\n\t */\n\tpublic setValue(value: string) {\n\t\tthis.data.value = valueValidator.parse(value);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this text input is required.\n\t *\n\t * @param required - Whether this text input is required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = requiredValidator.parse(required);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APITextInputComponent {\n\t\tvalidateRequiredParameters(this.data.custom_id, this.data.style, this.data.label);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as APITextInputComponent;\n\t}\n\n\t/**\n\t * Whether this is equal to another structure.\n\t */\n\tpublic equals(other: APITextInputComponent | JSONEncodable): boolean {\n\t\tif (isJSONEncodable(other)) {\n\t\t\treturn isEqual(other.toJSON(), this.data);\n\t\t}\n\n\t\treturn isEqual(other, this.data);\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { TextInputStyle } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport { customIdValidator } from '../Assertions.js';\n\nexport const textInputStyleValidator = s.nativeEnum(TextInputStyle);\nexport const minLengthValidator = s\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(4_000)\n\t.setValidationEnabled(isValidationEnabled);\nexport const maxLengthValidator = s\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(1)\n\t.lessThanOrEqual(4_000)\n\t.setValidationEnabled(isValidationEnabled);\nexport const requiredValidator = s.boolean();\nexport const valueValidator = s.string().lengthLessThanOrEqual(4_000).setValidationEnabled(isValidationEnabled);\nexport const placeholderValidator = s.string().lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);\nexport const labelValidator = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(45)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredParameters(customId?: string, style?: TextInputStyle, label?: string) {\n\tcustomIdValidator.parse(customId);\n\ttextInputStyleValidator.parse(style);\n\tlabelValidator.parse(label);\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport type {\n\tAPIActionRowComponent,\n\tAPIComponentInContainer,\n\tAPIComponentInMessageActionRow,\n\tAPIContainerComponent,\n\tAPIFileComponent,\n\tAPIMediaGalleryComponent,\n\tAPISectionComponent,\n\tAPISeparatorComponent,\n\tAPITextDisplayComponent,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport type { RGBTuple } from '../../index.js';\nimport { MediaGalleryBuilder, SectionBuilder } from '../../index.js';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport type { AnyComponentBuilder, MessageActionRowComponentBuilder } from '../ActionRow.js';\nimport { ActionRowBuilder } from '../ActionRow.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { createComponentBuilder, resolveBuilder } from '../Components.js';\nimport { containerColorPredicate, spoilerPredicate } from './Assertions.js';\nimport { FileBuilder } from './File.js';\nimport { SeparatorBuilder } from './Separator.js';\nimport { TextDisplayBuilder } from './TextDisplay.js';\n\n/**\n * The builders that may be used within a container.\n */\nexport type ContainerComponentBuilder =\n\t| ActionRowBuilder\n\t| FileBuilder\n\t| MediaGalleryBuilder\n\t| SectionBuilder\n\t| SeparatorBuilder\n\t| TextDisplayBuilder;\n\n/**\n * A builder that creates API-compatible JSON data for a container.\n */\nexport class ContainerBuilder extends ComponentBuilder {\n\t/**\n\t * The components within this container.\n\t */\n\tpublic readonly components: ContainerComponentBuilder[];\n\n\t/**\n\t * Creates a new container from API data.\n\t *\n\t * @param data - The API data to create this container with\n\t * @example\n\t * Creating a container from an API data object:\n\t * ```ts\n\t * const container = new ContainerBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"Some text here\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating a container using setters and API data:\n\t * ```ts\n\t * const container = new ContainerBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"# Heading\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.addComponents(separator, section);\n\t * ```\n\t */\n\tpublic constructor({ components, ...data }: Partial = {}) {\n\t\tsuper({ type: ComponentType.Container, ...data });\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ??\n\t\t\t[]) as ContainerComponentBuilder[];\n\t}\n\n\t/**\n\t * Sets the accent color of this container.\n\t *\n\t * @param color - The color to use\n\t */\n\tpublic setAccentColor(color?: RGBTuple | number): this {\n\t\t// Data assertions\n\t\tcontainerColorPredicate.parse(color);\n\n\t\tif (Array.isArray(color)) {\n\t\t\tconst [red, green, blue] = color;\n\t\t\tthis.data.accent_color = (red << 16) + (green << 8) + blue;\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.data.accent_color = color;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the accent color of this container.\n\t */\n\tpublic clearAccentColor() {\n\t\tthis.data.accent_color = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds action row components to this container.\n\t *\n\t * @param components - The action row components to add\n\t */\n\tpublic addActionRowComponents(\n\t\t...components: RestOrArray<\n\t\t\t| ActionRowBuilder\n\t\t\t| APIActionRowComponent\n\t\t\t| ((builder: ActionRowBuilder) => ActionRowBuilder)\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component) => resolveBuilder(component, ActionRowBuilder)),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds file components to this container.\n\t *\n\t * @param components - The file components to add\n\t */\n\tpublic addFileComponents(\n\t\t...components: RestOrArray FileBuilder)>\n\t) {\n\t\tthis.components.push(...normalizeArray(components).map((component) => resolveBuilder(component, FileBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds media gallery components to this container.\n\t *\n\t * @param components - The media gallery components to add\n\t */\n\tpublic addMediaGalleryComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPIMediaGalleryComponent | MediaGalleryBuilder | ((builder: MediaGalleryBuilder) => MediaGalleryBuilder)\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component) => resolveBuilder(component, MediaGalleryBuilder)),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds section components to this container.\n\t *\n\t * @param components - The section components to add\n\t */\n\tpublic addSectionComponents(\n\t\t...components: RestOrArray SectionBuilder)>\n\t) {\n\t\tthis.components.push(...normalizeArray(components).map((component) => resolveBuilder(component, SectionBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds separator components to this container.\n\t *\n\t * @param components - The separator components to add\n\t */\n\tpublic addSeparatorComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPISeparatorComponent | SeparatorBuilder | ((builder: SeparatorBuilder) => SeparatorBuilder)\n\t\t>\n\t) {\n\t\tthis.components.push(...normalizeArray(components).map((component) => resolveBuilder(component, SeparatorBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds text display components to this container.\n\t *\n\t * @param components - The text display components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component) => resolveBuilder(component, TextDisplayBuilder)),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts components for this container.\n\t *\n\t * @param index - The index to start removing, replacing or inserting components\n\t * @param deleteCount - The amount of components to remove\n\t * @param components - The components to set\n\t */\n\tpublic spliceComponents(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...components: RestOrArray\n\t) {\n\t\tthis.components.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...normalizeArray(components).map((component) =>\n\t\t\t\tcomponent instanceof ComponentBuilder ? component : createComponentBuilder(component),\n\t\t\t),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this container.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoilerPredicate.parse(spoiler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIContainerComponent {\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t} as APIContainerComponent;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { SeparatorSpacingSize } from 'discord-api-types/v10';\nimport { colorPredicate } from '../../messages/embed/Assertions';\nimport { isValidationEnabled } from '../../util/validation';\nimport { ComponentBuilder } from '../Component';\nimport { ButtonBuilder } from '../button/Button';\nimport type { ContainerComponentBuilder } from './Container';\nimport type { MediaGalleryItemBuilder } from './MediaGalleryItem';\nimport type { TextDisplayBuilder } from './TextDisplay';\nimport { ThumbnailBuilder } from './Thumbnail';\n\nexport const unfurledMediaItemPredicate = s\n\t.object({\n\t\turl: s\n\t\t\t.string()\n\t\t\t.url(\n\t\t\t\t{ allowedProtocols: ['http:', 'https:', 'attachment:'] },\n\t\t\t\t{ message: 'Invalid protocol for media URL. Must be http:, https:, or attachment:' },\n\t\t\t),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const descriptionPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(1_024)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const filePredicate = s\n\t.object({\n\t\turl: s\n\t\t\t.string()\n\t\t\t.url({ allowedProtocols: ['attachment:'] }, { message: 'Invalid protocol for file URL. Must be attachment:' }),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const spoilerPredicate = s.boolean();\n\nexport const dividerPredicate = s.boolean();\n\nexport const spacingPredicate = s.nativeEnum(SeparatorSpacingSize);\n\nexport const textDisplayContentPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(4_000)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const accessoryPredicate = s\n\t.instance(ButtonBuilder)\n\t.or(s.instance(ThumbnailBuilder))\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const containerColorPredicate = colorPredicate.nullish();\n\nexport function assertReturnOfBuilder(\n\tinput: unknown,\n\tExpectedInstanceOf: new () => ReturnType,\n): asserts input is ReturnType {\n\ts.instance(ExpectedInstanceOf).setValidationEnabled(isValidationEnabled).parse(input);\n}\n\nexport function validateComponentArray<\n\tReturnType extends ContainerComponentBuilder | MediaGalleryItemBuilder = ContainerComponentBuilder,\n>(input: unknown, min: number, max: number, ExpectedInstanceOf?: new () => ReturnType): asserts input is ReturnType[] {\n\t(ExpectedInstanceOf ? s.instance(ExpectedInstanceOf) : s.instance(ComponentBuilder))\n\t\t.array()\n\t\t.lengthGreaterThanOrEqual(min)\n\t\t.lengthLessThanOrEqual(max)\n\t\t.setValidationEnabled(isValidationEnabled)\n\t\t.parse(input);\n}\n","import type { APIThumbnailComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component';\nimport { descriptionPredicate, spoilerPredicate, unfurledMediaItemPredicate } from './Assertions';\n\nexport class ThumbnailBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new thumbnail from API data.\n\t *\n\t * @param data - The API data to create this thumbnail with\n\t * @example\n\t * Creating a thumbnail from an API data object:\n\t * ```ts\n\t * const thumbnail = new ThumbnailBuilder({\n\t * \tdescription: 'some text',\n\t * media: {\n\t * url: 'https://cdn.discordapp.com/embed/avatars/4.png',\n\t * },\n\t * });\n\t * ```\n\t * @example\n\t * Creating a thumbnail using setters and API data:\n\t * ```ts\n\t * const thumbnail = new ThumbnailBuilder({\n\t * \tmedia: {\n\t * url: 'attachment://image.png',\n\t * },\n\t * })\n\t * \t.setDescription('alt text');\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({\n\t\t\ttype: ComponentType.Thumbnail,\n\t\t\t...data,\n\t\t\tmedia: data.media ? { url: data.media.url } : undefined,\n\t\t});\n\t}\n\n\t/**\n\t * Sets the description of this thumbnail.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = descriptionPredicate.parse(description);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description of this thumbnail.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this thumbnail.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoilerPredicate.parse(spoiler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the media URL of this thumbnail.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.media = unfurledMediaItemPredicate.parse({ url });\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritdoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APIThumbnailComponent {\n\t\tunfurledMediaItemPredicate.parse(this.data.media);\n\n\t\treturn { ...this.data } as APIThumbnailComponent;\n\t}\n}\n","import { ComponentType, type APIFileComponent } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component';\nimport { filePredicate, spoilerPredicate } from './Assertions';\n\nexport class FileBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new file from API data.\n\t *\n\t * @param data - The API data to create this file with\n\t * @example\n\t * Creating a file from an API data object:\n\t * ```ts\n\t * const file = new FileBuilder({\n\t * \tspoiler: true,\n\t * \tfile: {\n\t * \t\turl: 'attachment://file.png',\n\t * \t},\n\t * });\n\t * ```\n\t * @example\n\t * Creating a file using setters and API data:\n\t * ```ts\n\t * const file = new FileBuilder({\n\t * \tfile: {\n\t * \t\turl: 'attachment://image.jpg',\n\t * \t},\n\t * })\n\t * \t.setSpoiler(false);\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({ type: ComponentType.File, ...data, file: data.file ? { url: data.file.url } : undefined });\n\t}\n\n\t/**\n\t * Sets the spoiler status of this file.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoilerPredicate.parse(spoiler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the media URL of this file.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.file = filePredicate.parse({ url });\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APIFileComponent {\n\t\tfilePredicate.parse(this.data.file);\n\n\t\treturn { ...this.data, file: { ...this.data.file } } as APIFileComponent;\n\t}\n}\n","import type { SeparatorSpacingSize, APISeparatorComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component';\nimport { dividerPredicate, spacingPredicate } from './Assertions';\n\nexport class SeparatorBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new separator from API data.\n\t *\n\t * @param data - The API data to create this separator with\n\t * @example\n\t * Creating a separator from an API data object:\n\t * ```ts\n\t * const separator = new SeparatorBuilder({\n\t * \tspacing: SeparatorSpacingSize.Small,\n\t * divider: true,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a separator using setters and API data:\n\t * ```ts\n\t * const separator = new SeparatorBuilder({\n\t * \tspacing: SeparatorSpacingSize.Large,\n\t * })\n\t * \t.setDivider(false);\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({\n\t\t\ttype: ComponentType.Separator,\n\t\t\t...data,\n\t\t});\n\t}\n\n\t/**\n\t * Sets whether this separator should show a divider line.\n\t *\n\t * @param divider - Whether to show a divider line\n\t */\n\tpublic setDivider(divider = true) {\n\t\tthis.data.divider = dividerPredicate.parse(divider);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spacing of this separator.\n\t *\n\t * @param spacing - The spacing to use\n\t */\n\tpublic setSpacing(spacing: SeparatorSpacingSize) {\n\t\tthis.data.spacing = spacingPredicate.parse(spacing);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the spacing of this separator.\n\t */\n\tpublic clearSpacing() {\n\t\tthis.data.spacing = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APISeparatorComponent {\n\t\treturn { ...this.data } as APISeparatorComponent;\n\t}\n}\n","import type { APITextDisplayComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component';\nimport { textDisplayContentPredicate } from './Assertions';\n\nexport class TextDisplayBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new text display from API data.\n\t *\n\t * @param data - The API data to create this text display with\n\t * @example\n\t * Creating a text display from an API data object:\n\t * ```ts\n\t * const textDisplay = new TextDisplayBuilder({\n\t * \tcontent: 'some text',\n\t * });\n\t * ```\n\t * @example\n\t * Creating a text display using setters and API data:\n\t * ```ts\n\t * const textDisplay = new TextDisplayBuilder({\n\t * \tcontent: 'old text',\n\t * })\n\t * \t.setContent('new text');\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({\n\t\t\ttype: ComponentType.TextDisplay,\n\t\t\t...data,\n\t\t});\n\t}\n\n\t/**\n\t * Sets the text of this text display.\n\t *\n\t * @param content - The text to use\n\t */\n\tpublic setContent(content: string) {\n\t\tthis.data.content = textDisplayContentPredicate.parse(content);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APITextDisplayComponent {\n\t\ttextDisplayContentPredicate.parse(this.data.content);\n\n\t\treturn { ...this.data } as APITextDisplayComponent;\n\t}\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport type { APIMediaGalleryComponent, APIMediaGalleryItem } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { resolveBuilder } from '../Components.js';\nimport { assertReturnOfBuilder, validateComponentArray } from './Assertions.js';\nimport { MediaGalleryItemBuilder } from './MediaGalleryItem.js';\n\n/**\n * A builder that creates API-compatible JSON data for a container.\n */\nexport class MediaGalleryBuilder extends ComponentBuilder {\n\t/**\n\t * The components within this container.\n\t */\n\tpublic readonly items: MediaGalleryItemBuilder[];\n\n\t/**\n\t * Creates a new media gallery from API data.\n\t *\n\t * @param data - The API data to create this media gallery with\n\t * @example\n\t * Creating a media gallery from an API data object:\n\t * ```ts\n\t * const mediaGallery = new MediaGalleryBuilder({\n\t * \titems: [\n\t * \t\t{\n\t * \t\t\tdescription: \"Some text here\",\n\t * \t\t\tmedia: {\n\t * \t\t\t\turl: 'https://cdn.discordapp.com/embed/avatars/2.png',\n\t * \t\t\t},\n\t * \t\t},\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating a media gallery using setters and API data:\n\t * ```ts\n\t * const mediaGallery = new MediaGalleryBuilder({\n\t * \titems: [\n\t * \t\t{\n\t * \t\t\tdescription: \"alt text\",\n\t * \t\t\tmedia: {\n\t * \t\t\t\turl: 'https://cdn.discordapp.com/embed/avatars/5.png',\n\t * \t\t\t},\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.addItems(item2, item3);\n\t * ```\n\t */\n\tpublic constructor({ items, ...data }: Partial = {}) {\n\t\tsuper({ type: ComponentType.MediaGallery, ...data });\n\t\tthis.items = items?.map((item) => new MediaGalleryItemBuilder(item)) ?? [];\n\t}\n\n\t/**\n\t * Adds items to this media gallery.\n\t *\n\t * @param items - The items to add\n\t */\n\tpublic addItems(\n\t\t...items: RestOrArray<\n\t\t\tAPIMediaGalleryItem | MediaGalleryItemBuilder | ((builder: MediaGalleryItemBuilder) => MediaGalleryItemBuilder)\n\t\t>\n\t) {\n\t\tthis.items.push(\n\t\t\t...normalizeArray(items).map((input) => {\n\t\t\t\tconst result = resolveBuilder(input, MediaGalleryItemBuilder);\n\n\t\t\t\tassertReturnOfBuilder(result, MediaGalleryItemBuilder);\n\t\t\t\treturn result;\n\t\t\t}),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts media gallery items for this media gallery.\n\t *\n\t * @param index - The index to start removing, replacing or inserting items\n\t * @param deleteCount - The amount of items to remove\n\t * @param items - The items to insert\n\t */\n\tpublic spliceItems(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...items: RestOrArray<\n\t\t\tAPIMediaGalleryItem | MediaGalleryItemBuilder | ((builder: MediaGalleryItemBuilder) => MediaGalleryItemBuilder)\n\t\t>\n\t) {\n\t\tthis.items.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...normalizeArray(items).map((input) => {\n\t\t\t\tconst result = resolveBuilder(input, MediaGalleryItemBuilder);\n\n\t\t\t\tassertReturnOfBuilder(result, MediaGalleryItemBuilder);\n\t\t\t\treturn result;\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 toJSON(): APIMediaGalleryComponent {\n\t\tvalidateComponentArray(this.items, 1, 10, MediaGalleryItemBuilder);\n\t\treturn {\n\t\t\t...this.data,\n\t\t\titems: this.items.map((item) => item.toJSON()),\n\t\t} as APIMediaGalleryComponent;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIMediaGalleryItem } from 'discord-api-types/v10';\nimport { descriptionPredicate, spoilerPredicate, unfurledMediaItemPredicate } from './Assertions';\n\nexport class MediaGalleryItemBuilder implements JSONEncodable {\n\t/**\n\t * The API data associated with this media gallery item.\n\t */\n\tpublic readonly data: Partial;\n\n\t/**\n\t * Creates a new media gallery item from API data.\n\t *\n\t * @param data - The API data to create this media gallery item with\n\t * @example\n\t * Creating a media gallery item from an API data object:\n\t * ```ts\n\t * const item = new MediaGalleryItemBuilder({\n\t * \tdescription: \"Some text here\",\n\t * \tmedia: {\n\t * \t\turl: 'https://cdn.discordapp.com/embed/avatars/2.png',\n\t * \t},\n\t * });\n\t * ```\n\t * @example\n\t * Creating a media gallery item using setters and API data:\n\t * ```ts\n\t * const item = new MediaGalleryItemBuilder({\n\t * \tmedia: {\n\t * \t\turl: 'https://cdn.discordapp.com/embed/avatars/5.png',\n\t * \t},\n\t * })\n\t * \t.setDescription(\"alt text\");\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tthis.data = data;\n\t}\n\n\t/**\n\t * Sets the description of this media gallery item.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = descriptionPredicate.parse(description);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description of this media gallery item.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this media gallery item.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoilerPredicate.parse(spoiler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the media URL of this media gallery item.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.media = unfurledMediaItemPredicate.parse({ url });\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIMediaGalleryItem {\n\t\tunfurledMediaItemPredicate.parse(this.data.media);\n\n\t\treturn { ...this.data } as APIMediaGalleryItem;\n\t}\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport type {\n\tAPIButtonComponent,\n\tAPISectionComponent,\n\tAPITextDisplayComponent,\n\tAPIThumbnailComponent,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ButtonBuilder, ThumbnailBuilder } from '../../index.js';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { createComponentBuilder, resolveBuilder } from '../Components.js';\nimport { accessoryPredicate, assertReturnOfBuilder, validateComponentArray } from './Assertions.js';\nimport { TextDisplayBuilder } from './TextDisplay.js';\n\n/**\n * A builder that creates API-compatible JSON data for a section.\n */\nexport class SectionBuilder extends ComponentBuilder {\n\t/**\n\t * The components within this section.\n\t */\n\tpublic readonly components: ComponentBuilder[];\n\n\t/**\n\t * The accessory of this section.\n\t */\n\tpublic readonly accessory?: ButtonBuilder | ThumbnailBuilder;\n\n\t/**\n\t * Creates a new section from API data.\n\t *\n\t * @param data - The API data to create this section with\n\t * @example\n\t * Creating a section from an API data object:\n\t * ```ts\n\t * const section = new SectionBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"Some text here\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * accessory: {\n\t * media: {\n\t * url: 'https://cdn.discordapp.com/embed/avatars/3.png',\n\t * },\n\t * }\n\t * });\n\t * ```\n\t * @example\n\t * Creating a section using setters and API data:\n\t * ```ts\n\t * const section = new SectionBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"# Heading\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.setPrimaryButtonAccessory(button);\n\t * ```\n\t */\n\tpublic constructor({ components, accessory, ...data }: Partial = {}) {\n\t\tsuper({ type: ComponentType.Section, ...data });\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ?? []) as ComponentBuilder[];\n\t\tthis.accessory = accessory ? createComponentBuilder(accessory) : undefined;\n\t}\n\n\t/**\n\t * Sets the accessory of this section to a button.\n\t *\n\t * @param accessory - The accessory to use\n\t */\n\tpublic setButtonAccessory(\n\t\taccessory: APIButtonComponent | ButtonBuilder | ((builder: ButtonBuilder) => ButtonBuilder),\n\t): this {\n\t\tReflect.set(this, 'accessory', accessoryPredicate.parse(resolveBuilder(accessory, ButtonBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the accessory of this section to a thumbnail.\n\t *\n\t * @param accessory - The accessory to use\n\t */\n\tpublic setThumbnailAccessory(\n\t\taccessory: APIThumbnailComponent | ThumbnailBuilder | ((builder: ThumbnailBuilder) => ThumbnailBuilder),\n\t): this {\n\t\tReflect.set(this, 'accessory', accessoryPredicate.parse(resolveBuilder(accessory, ThumbnailBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds text display components to this section.\n\t *\n\t * @param components - The text display components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...components: RestOrArray TextDisplayBuilder)>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((input) => {\n\t\t\t\tconst result = resolveBuilder(input, TextDisplayBuilder);\n\n\t\t\t\tassertReturnOfBuilder(result, TextDisplayBuilder);\n\t\t\t\treturn result;\n\t\t\t}),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts text display components for this section.\n\t *\n\t * @param index - The index to start removing, replacing or inserting text display components\n\t * @param deleteCount - The amount of text display components to remove\n\t * @param components - The text display components to insert\n\t */\n\tpublic spliceTextDisplayComponents(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...components: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t) {\n\t\tthis.components.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...normalizeArray(components).map((input) => {\n\t\t\t\tconst result = resolveBuilder(input, TextDisplayBuilder);\n\n\t\t\t\tassertReturnOfBuilder(result, TextDisplayBuilder);\n\t\t\t\treturn result;\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 toJSON(): APISectionComponent {\n\t\tvalidateComponentArray(this.components, 1, 3, TextDisplayBuilder);\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t\taccessory: accessoryPredicate.parse(this.accessory).toJSON(),\n\t\t} as APISectionComponent;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../components/ActionRow.js';\nimport { customIdValidator } from '../../components/Assertions.js';\nimport { isValidationEnabled } from '../../util/validation.js';\n\nexport const titleValidator = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(45)\n\t.setValidationEnabled(isValidationEnabled);\nexport const componentsValidator = s\n\t.instance(ActionRowBuilder)\n\t.array()\n\t.lengthGreaterThanOrEqual(1)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredParameters(\n\tcustomId?: string,\n\ttitle?: string,\n\tcomponents?: ActionRowBuilder[],\n) {\n\tcustomIdValidator.parse(customId);\n\ttitleValidator.parse(title);\n\tcomponentsValidator.parse(components);\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tAPIActionRowComponent,\n\tAPIComponentInModalActionRow,\n\tAPIModalInteractionResponseCallbackData,\n} from 'discord-api-types/v10';\nimport { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../components/ActionRow.js';\nimport { customIdValidator } from '../../components/Assertions.js';\nimport { createComponentBuilder } from '../../components/Components.js';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { titleValidator, validateRequiredParameters } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for modals.\n */\nexport class ModalBuilder implements JSONEncodable {\n\t/**\n\t * The API data associated with this modal.\n\t */\n\tpublic readonly data: Partial;\n\n\t/**\n\t * The components within this modal.\n\t */\n\tpublic readonly components: ActionRowBuilder[] = [];\n\n\t/**\n\t * Creates a new modal from API data.\n\t *\n\t * @param data - The API data to create this modal with\n\t */\n\tpublic constructor({ components, ...data }: Partial = {}) {\n\t\tthis.data = { ...data };\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ??\n\t\t\t[]) as ActionRowBuilder[];\n\t}\n\n\t/**\n\t * Sets the title of this modal.\n\t *\n\t * @param title - The title to use\n\t */\n\tpublic setTitle(title: string) {\n\t\tthis.data.title = titleValidator.parse(title);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom id of this modal.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds components to this modal.\n\t *\n\t * @param components - The components to add\n\t */\n\tpublic addComponents(\n\t\t...components: RestOrArray<\n\t\t\tActionRowBuilder | APIActionRowComponent\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component) =>\n\t\t\t\tcomponent instanceof ActionRowBuilder\n\t\t\t\t\t? component\n\t\t\t\t\t: new ActionRowBuilder(component),\n\t\t\t),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets components for this modal.\n\t *\n\t * @param components - The components to set\n\t */\n\tpublic setComponents(...components: RestOrArray>) {\n\t\tthis.components.splice(0, this.components.length, ...normalizeArray(components));\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIModalInteractionResponseCallbackData {\n\t\tvalidateRequiredParameters(this.data.custom_id, this.data.title, this.components);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t} as APIModalInteractionResponseCallbackData;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport {\n\tApplicationIntegrationType,\n\tInteractionContextType,\n\tLocale,\n\ttype APIApplicationCommandOptionChoice,\n\ttype LocalizationMap,\n} from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder.js';\nimport type { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands.js';\nimport type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase.js';\n\nconst namePredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(32)\n\t.regex(/^[\\p{Ll}\\p{Lm}\\p{Lo}\\p{N}\\p{sc=Devanagari}\\p{sc=Thai}_-]+$/u)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateName(name: unknown): asserts name is string {\n\tnamePredicate.parse(name);\n}\n\nconst descriptionPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(100)\n\t.setValidationEnabled(isValidationEnabled);\nconst localePredicate = s.nativeEnum(Locale);\n\nexport function validateDescription(description: unknown): asserts description is string {\n\tdescriptionPredicate.parse(description);\n}\n\nconst maxArrayLengthPredicate = s.unknown().array().lengthLessThanOrEqual(25).setValidationEnabled(isValidationEnabled);\nexport function validateLocale(locale: unknown) {\n\treturn localePredicate.parse(locale);\n}\n\nexport function validateMaxOptionsLength(options: unknown): asserts options is ToAPIApplicationCommandOptions[] {\n\tmaxArrayLengthPredicate.parse(options);\n}\n\nexport function validateRequiredParameters(\n\tname: string,\n\tdescription: string,\n\toptions: ToAPIApplicationCommandOptions[],\n) {\n\t// Assert name matches all conditions\n\tvalidateName(name);\n\n\t// Assert description conditions\n\tvalidateDescription(description);\n\n\t// Assert options conditions\n\tvalidateMaxOptionsLength(options);\n}\n\nconst booleanPredicate = s.boolean();\n\nexport function validateDefaultPermission(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport function validateRequired(required: unknown): asserts required is boolean {\n\tbooleanPredicate.parse(required);\n}\n\nconst choicesLengthPredicate = s.number().lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);\n\nexport function validateChoicesLength(amountAdding: number, choices?: APIApplicationCommandOptionChoice[]): void {\n\tchoicesLengthPredicate.parse((choices?.length ?? 0) + amountAdding);\n}\n\nexport function assertReturnOfBuilder<\n\tReturnType extends ApplicationCommandOptionBase | SlashCommandSubcommandBuilder | SlashCommandSubcommandGroupBuilder,\n>(input: unknown, ExpectedInstanceOf: new () => ReturnType): asserts input is ReturnType {\n\ts.instance(ExpectedInstanceOf).parse(input);\n}\n\nexport const localizationMapPredicate = s\n\t.object(Object.fromEntries(Object.values(Locale).map((locale) => [locale, s.string().nullish()])))\n\t.strict()\n\t.nullish()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateLocalizationMap(value: unknown): asserts value is LocalizationMap {\n\tlocalizationMapPredicate.parse(value);\n}\n\nconst dmPermissionPredicate = s.boolean().nullish();\n\nexport function validateDMPermission(value: unknown): asserts value is boolean | null | undefined {\n\tdmPermissionPredicate.parse(value);\n}\n\nconst memberPermissionPredicate = s\n\t.union([\n\t\ts.bigint().transform((value) => value.toString()),\n\t\ts\n\t\t\t.number()\n\t\t\t.safeInt()\n\t\t\t.transform((value) => value.toString()),\n\t\ts.string().regex(/^\\d+$/),\n\t])\n\t.nullish();\n\nexport function validateDefaultMemberPermissions(permissions: unknown) {\n\treturn memberPermissionPredicate.parse(permissions);\n}\n\nexport function validateNSFW(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport const contextsPredicate = s.array(\n\ts.nativeEnum(InteractionContextType).setValidationEnabled(isValidationEnabled),\n);\n\nexport const integrationTypesPredicate = s.array(\n\ts.nativeEnum(ApplicationIntegrationType).setValidationEnabled(isValidationEnabled),\n);\n","import type {\n\tAPIApplicationCommandOption,\n\tApplicationIntegrationType,\n\tInteractionContextType,\n\tLocalizationMap,\n\tPermissions,\n} from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription.js';\nimport { SharedSlashCommand } from './mixins/SharedSlashCommand.js';\nimport { SharedSlashCommandOptions } from './mixins/SharedSlashCommandOptions.js';\nimport { SharedSlashCommandSubcommands } from './mixins/SharedSubcommands.js';\n\n/**\n * A builder that creates API-compatible JSON data for slash commands.\n */\n@mix(SharedSlashCommandOptions, SharedNameAndDescription, SharedSlashCommandSubcommands, SharedSlashCommand)\nexport class SlashCommandBuilder {\n\t/**\n\t * The name of this command.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The name localizations of this command.\n\t */\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\t/**\n\t * The description of this command.\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The description localizations of this command.\n\t */\n\tpublic readonly description_localizations?: LocalizationMap;\n\n\t/**\n\t * The options of this command.\n\t */\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\t/**\n\t * The contexts for this command.\n\t */\n\tpublic readonly contexts?: InteractionContextType[];\n\n\t/**\n\t * Whether this command is enabled by default when the application is added to a guild.\n\t *\n\t * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.setDMPermission} instead.\n\t */\n\tpublic readonly default_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The set of permissions represented as a bit set for the command.\n\t */\n\tpublic readonly default_member_permissions: Permissions | null | undefined = undefined;\n\n\t/**\n\t * Indicates whether the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This property is only for global commands.\n\t * @deprecated\n\t * Use {@link SlashCommandBuilder.contexts} instead.\n\t */\n\tpublic readonly dm_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The integration types for this command.\n\t */\n\tpublic readonly integration_types?: ApplicationIntegrationType[];\n\n\t/**\n\t * Whether this command is NSFW.\n\t */\n\tpublic readonly nsfw: boolean | undefined = undefined;\n}\n\nexport interface SlashCommandBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandOptions,\n\t\tSharedSlashCommandSubcommands,\n\t\tSharedSlashCommand {}\n\n/**\n * An interface specifically for slash command subcommands.\n */\nexport interface SlashCommandSubcommandsOnlyBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandSubcommands,\n\t\tSharedSlashCommand {}\n\n/**\n * An interface specifically for slash command options.\n */\nexport interface SlashCommandOptionsOnlyBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandOptions,\n\t\tSharedSlashCommand {}\n\n/**\n * An interface that ensures the `toJSON()` call will return something\n * that can be serialized into API-compatible data.\n */\nexport interface ToAPIApplicationCommandOptions {\n\ttoJSON(): APIApplicationCommandOption;\n}\n","import type { LocaleString, LocalizationMap } from 'discord-api-types/v10';\nimport { validateDescription, validateLocale, validateName } from '../Assertions.js';\n\n/**\n * This mixin holds name and description symbols for slash commands.\n */\nexport class SharedNameAndDescription {\n\t/**\n\t * The name of this command.\n\t */\n\tpublic readonly name!: string;\n\n\t/**\n\t * The name localizations of this command.\n\t */\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\t/**\n\t * The description of this command.\n\t */\n\tpublic readonly description!: string;\n\n\t/**\n\t * The description localizations of this command.\n\t */\n\tpublic readonly description_localizations?: LocalizationMap;\n\n\t/**\n\t * Sets the name of this command.\n\t *\n\t * @param name - The name to use\n\t */\n\tpublic setName(name: string): this {\n\t\t// Assert the name matches the conditions\n\t\tvalidateName(name);\n\n\t\tReflect.set(this, 'name', name);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this command.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\t// Assert the description matches the conditions\n\t\tvalidateDescription(description);\n\n\t\tReflect.set(this, 'description', description);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a name localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedName - The localized name for the given `locale`\n\t */\n\tpublic setNameLocalization(locale: LocaleString, localizedName: string | null) {\n\t\tif (!this.name_localizations) {\n\t\t\tReflect.set(this, 'name_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedName === null) {\n\t\t\tthis.name_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateName(localizedName);\n\n\t\tthis.name_localizations![parsedLocale] = localizedName;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name localizations for this command.\n\t *\n\t * @param localizedNames - The object of localized names to set\n\t */\n\tpublic setNameLocalizations(localizedNames: LocalizationMap | null) {\n\t\tif (localizedNames === null) {\n\t\t\tReflect.set(this, 'name_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'name_localizations', {});\n\n\t\tfor (const args of Object.entries(localizedNames)) {\n\t\t\tthis.setNameLocalization(...(args as [LocaleString, string | null]));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a description localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedDescription - The localized description for the given locale\n\t */\n\tpublic setDescriptionLocalization(locale: LocaleString, localizedDescription: string | null) {\n\t\tif (!this.description_localizations) {\n\t\t\tReflect.set(this, 'description_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedDescription === null) {\n\t\t\tthis.description_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateDescription(localizedDescription);\n\n\t\tthis.description_localizations![parsedLocale] = localizedDescription;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description localizations for this command.\n\t *\n\t * @param localizedDescriptions - The object of localized descriptions to set\n\t */\n\tpublic setDescriptionLocalizations(localizedDescriptions: LocalizationMap | null) {\n\t\tif (localizedDescriptions === null) {\n\t\t\tReflect.set(this, 'description_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'description_localizations', {});\n\t\tfor (const args of Object.entries(localizedDescriptions)) {\n\t\t\tthis.setDescriptionLocalization(...(args as [LocaleString, string | null]));\n\t\t}\n\n\t\treturn this;\n\t}\n}\n","import {\n\tApplicationCommandType,\n\ttype ApplicationIntegrationType,\n\ttype InteractionContextType,\n\ttype LocalizationMap,\n\ttype Permissions,\n\ttype RESTPostAPIChatInputApplicationCommandsJSONBody,\n} from 'discord-api-types/v10';\nimport type { RestOrArray } from '../../../util/normalizeArray.js';\nimport { normalizeArray } from '../../../util/normalizeArray.js';\nimport {\n\tcontextsPredicate,\n\tintegrationTypesPredicate,\n\tvalidateDMPermission,\n\tvalidateDefaultMemberPermissions,\n\tvalidateDefaultPermission,\n\tvalidateLocalizationMap,\n\tvalidateNSFW,\n\tvalidateRequiredParameters,\n} from '../Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder.js';\n\n/**\n * This mixin holds symbols that can be shared in slashcommands independent of options or subcommands.\n */\nexport class SharedSlashCommand {\n\tpublic readonly name: string = undefined!;\n\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\tpublic readonly description: string = undefined!;\n\n\tpublic readonly description_localizations?: LocalizationMap;\n\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\tpublic readonly contexts?: InteractionContextType[];\n\n\t/**\n\t * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.setDMPermission} instead.\n\t */\n\tpublic readonly default_permission: boolean | undefined = undefined;\n\n\tpublic readonly default_member_permissions: Permissions | null | undefined = undefined;\n\n\t/**\n\t * @deprecated Use {@link SharedSlashCommand.contexts} instead.\n\t */\n\tpublic readonly dm_permission: boolean | undefined = undefined;\n\n\tpublic readonly integration_types?: ApplicationIntegrationType[];\n\n\tpublic readonly nsfw: boolean | undefined = undefined;\n\n\t/**\n\t * Sets the contexts of this command.\n\t *\n\t * @param contexts - The contexts\n\t */\n\tpublic setContexts(...contexts: RestOrArray) {\n\t\tReflect.set(this, 'contexts', contextsPredicate.parse(normalizeArray(contexts)));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the integration types of this command.\n\t *\n\t * @param integrationTypes - The integration types\n\t */\n\tpublic setIntegrationTypes(...integrationTypes: RestOrArray) {\n\t\tReflect.set(this, 'integration_types', integrationTypesPredicate.parse(normalizeArray(integrationTypes)));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether the command is enabled by default when the application is added to a guild.\n\t *\n\t * @remarks\n\t * If set to `false`, you will have to later `PUT` the permissions for this command.\n\t * @param value - Whether or not to enable this command by default\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.setDMPermission} instead.\n\t */\n\tpublic setDefaultPermission(value: boolean) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDefaultPermission(value);\n\n\t\tReflect.set(this, 'default_permission', value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the default permissions a member should have in order to run the command.\n\t *\n\t * @remarks\n\t * You can set this to `'0'` to disable the command by default.\n\t * @param permissions - The permissions bit field to set\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t */\n\tpublic setDefaultMemberPermissions(permissions: Permissions | bigint | number | null | undefined) {\n\t\t// Assert the value and parse it\n\t\tconst permissionValue = validateDefaultMemberPermissions(permissions);\n\n\t\tReflect.set(this, 'default_member_permissions', permissionValue);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets if the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This method is only for global commands.\n\t * @param enabled - Whether the command should be enabled in direct messages\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated\n\t * Use {@link SharedSlashCommand.setContexts} instead.\n\t */\n\tpublic setDMPermission(enabled: boolean | null | undefined) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDMPermission(enabled);\n\n\t\tReflect.set(this, 'dm_permission', enabled);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this command is NSFW.\n\t *\n\t * @param nsfw - Whether this command is NSFW\n\t */\n\tpublic setNSFW(nsfw = true) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateNSFW(nsfw);\n\t\tReflect.set(this, 'nsfw', nsfw);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): RESTPostAPIChatInputApplicationCommandsJSONBody {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\tvalidateLocalizationMap(this.name_localizations);\n\t\tvalidateLocalizationMap(this.description_localizations);\n\n\t\treturn {\n\t\t\t...this,\n\t\t\ttype: ApplicationCommandType.ChatInput,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandAttachmentOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command attachment option.\n */\nexport class SlashCommandAttachmentOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic override readonly type = ApplicationCommandOptionType.Attachment as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandAttachmentOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import type { APIApplicationCommandBasicOption, ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { validateRequiredParameters, validateRequired, validateLocalizationMap } from '../Assertions.js';\nimport { SharedNameAndDescription } from './NameAndDescription.js';\n\n/**\n * The base application command option builder that contains common symbols for application command builders.\n */\nexport abstract class ApplicationCommandOptionBase extends SharedNameAndDescription {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic abstract readonly type: ApplicationCommandOptionType;\n\n\t/**\n\t * Whether this option is required.\n\t *\n\t * @defaultValue `false`\n\t */\n\tpublic readonly required: boolean = false;\n\n\t/**\n\t * Sets whether this option is required.\n\t *\n\t * @param required - Whether this option should be required\n\t */\n\tpublic setRequired(required: boolean) {\n\t\t// Assert that you actually passed a boolean\n\t\tvalidateRequired(required);\n\n\t\tReflect.set(this, 'required', required);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\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(): APIApplicationCommandBasicOption;\n\n\t/**\n\t * This method runs required validators on this builder.\n\t */\n\tprotected runRequiredValidations() {\n\t\tvalidateRequiredParameters(this.name, this.description, []);\n\n\t\t// Validate localizations\n\t\tvalidateLocalizationMap(this.name_localizations);\n\t\tvalidateLocalizationMap(this.description_localizations);\n\n\t\t// Assert that you actually passed a boolean\n\t\tvalidateRequired(this.required);\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandBooleanOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command boolean option.\n */\nexport class SlashCommandBooleanOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Boolean as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandBooleanOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandChannelOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionChannelTypesMixin } from '../mixins/ApplicationCommandOptionChannelTypesMixin.js';\n\n/**\n * A slash command channel option.\n */\n@mix(ApplicationCommandOptionChannelTypesMixin)\nexport class SlashCommandChannelOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic override readonly type = ApplicationCommandOptionType.Channel as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandChannelOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandChannelOption extends ApplicationCommandOptionChannelTypesMixin {}\n","import { s } from '@sapphire/shapeshift';\nimport { ChannelType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../../util/normalizeArray';\n\n/**\n * The allowed channel types used for a channel option in a slash command builder.\n *\n * @privateRemarks This can't be dynamic because const enums are erased at runtime.\n * @internal\n */\nconst allowedChannelTypes = [\n\tChannelType.GuildText,\n\tChannelType.GuildVoice,\n\tChannelType.GuildCategory,\n\tChannelType.GuildAnnouncement,\n\tChannelType.AnnouncementThread,\n\tChannelType.PublicThread,\n\tChannelType.PrivateThread,\n\tChannelType.GuildStageVoice,\n\tChannelType.GuildForum,\n\tChannelType.GuildMedia,\n] as const;\n\n/**\n * The type of allowed channel types used for a channel option.\n */\nexport type ApplicationCommandOptionAllowedChannelTypes = (typeof allowedChannelTypes)[number];\n\nconst channelTypesPredicate = s.array(s.union(allowedChannelTypes.map((type) => s.literal(type))));\n\n/**\n * This mixin holds channel type symbols used for options.\n */\nexport class ApplicationCommandOptionChannelTypesMixin {\n\t/**\n\t * The channel types of this option.\n\t */\n\tpublic readonly channel_types?: ApplicationCommandOptionAllowedChannelTypes[];\n\n\t/**\n\t * Adds channel types to this option.\n\t *\n\t * @param channelTypes - The channel types\n\t */\n\tpublic addChannelTypes(...channelTypes: RestOrArray) {\n\t\tif (this.channel_types === undefined) {\n\t\t\tReflect.set(this, 'channel_types', []);\n\t\t}\n\n\t\tthis.channel_types!.push(...channelTypesPredicate.parse(normalizeArray(channelTypes)));\n\n\t\treturn this;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandIntegerOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\n\nconst numberValidator = s.number().int();\n\n/**\n * A slash command integer option.\n */\n@mix(\n\tApplicationCommandNumericOptionMinMaxValueMixin,\n\tApplicationCommandOptionWithAutocompleteMixin,\n\tApplicationCommandOptionWithChoicesMixin,\n)\nexport class SlashCommandIntegerOption\n\textends ApplicationCommandOptionBase\n\timplements ApplicationCommandNumericOptionMinMaxValueMixin\n{\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Integer as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}\n\t */\n\tpublic setMaxValue(max: number): this {\n\t\tnumberValidator.parse(max);\n\n\t\tReflect.set(this, 'max_value', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}\n\t */\n\tpublic setMinValue(min: number): this {\n\t\tnumberValidator.parse(min);\n\n\t\tReflect.set(this, 'min_value', min);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandIntegerOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this } as APIApplicationCommandIntegerOption;\n\t}\n}\n\nexport interface SlashCommandIntegerOption\n\textends ApplicationCommandNumericOptionMinMaxValueMixin,\n\t\tApplicationCommandOptionWithChoicesMixin,\n\t\tApplicationCommandOptionWithAutocompleteMixin {}\n","/**\n * This mixin holds minimum and maximum symbols used for options.\n */\nexport abstract class ApplicationCommandNumericOptionMinMaxValueMixin {\n\t/**\n\t * The maximum value of this option.\n\t */\n\tpublic readonly max_value?: number;\n\n\t/**\n\t * The minimum value of this option.\n\t */\n\tpublic readonly min_value?: number;\n\n\t/**\n\t * Sets the maximum number value of this option.\n\t *\n\t * @param max - The maximum value this option can be\n\t */\n\tpublic abstract setMaxValue(max: number): this;\n\n\t/**\n\t * Sets the minimum number value of this option.\n\t *\n\t * @param min - The minimum value this option can be\n\t */\n\tpublic abstract setMinValue(min: number): this;\n}\n","import { s } from '@sapphire/shapeshift';\nimport type { ApplicationCommandOptionType } from 'discord-api-types/v10';\n\nconst booleanPredicate = s.boolean();\n\n/**\n * This mixin holds choices and autocomplete symbols used for options.\n */\nexport class ApplicationCommandOptionWithAutocompleteMixin {\n\t/**\n\t * Whether this option utilizes autocomplete.\n\t */\n\tpublic readonly autocomplete?: boolean;\n\n\t/**\n\t * The type of this option.\n\t *\n\t * @privateRemarks Since this is present and this is a mixin, this is needed.\n\t */\n\tpublic readonly type!: ApplicationCommandOptionType;\n\n\t/**\n\t * Whether this option uses autocomplete.\n\t *\n\t * @param autocomplete - Whether this option should use autocomplete\n\t */\n\tpublic setAutocomplete(autocomplete: boolean): this {\n\t\t// Assert that you actually passed a boolean\n\t\tbooleanPredicate.parse(autocomplete);\n\n\t\tif (autocomplete && 'choices' in this && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tReflect.set(this, 'autocomplete', autocomplete);\n\n\t\treturn this;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandOptionChoice } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../../util/normalizeArray.js';\nimport { localizationMapPredicate, validateChoicesLength } from '../Assertions.js';\n\nconst stringPredicate = s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100);\nconst numberPredicate = s.number().greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY);\nconst choicesPredicate = s\n\t.object({\n\t\tname: stringPredicate,\n\t\tname_localizations: localizationMapPredicate,\n\t\tvalue: s.union([stringPredicate, numberPredicate]),\n\t})\n\t.array();\n\n/**\n * This mixin holds choices and autocomplete symbols used for options.\n */\nexport class ApplicationCommandOptionWithChoicesMixin {\n\t/**\n\t * The choices of this option.\n\t */\n\tpublic readonly choices?: APIApplicationCommandOptionChoice[];\n\n\t/**\n\t * The type of this option.\n\t *\n\t * @privateRemarks Since this is present and this is a mixin, this is needed.\n\t */\n\tpublic readonly type!: ApplicationCommandOptionType;\n\n\t/**\n\t * Adds multiple choices to this option.\n\t *\n\t * @param choices - The choices to add\n\t */\n\tpublic addChoices(...choices: RestOrArray>): this {\n\t\tconst normalizedChoices = normalizeArray(choices);\n\t\tif (normalizedChoices.length > 0 && 'autocomplete' in this && this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tchoicesPredicate.parse(normalizedChoices);\n\n\t\tif (this.choices === undefined) {\n\t\t\tReflect.set(this, 'choices', []);\n\t\t}\n\n\t\tvalidateChoicesLength(normalizedChoices.length, this.choices);\n\n\t\tfor (const { name, name_localizations, value } of normalizedChoices) {\n\t\t\t// Validate the value\n\t\t\tif (this.type === ApplicationCommandOptionType.String) {\n\t\t\t\tstringPredicate.parse(value);\n\t\t\t} else {\n\t\t\t\tnumberPredicate.parse(value);\n\t\t\t}\n\n\t\t\tthis.choices!.push({ name, name_localizations, value });\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets multiple choices for this option.\n\t *\n\t * @param choices - The choices to set\n\t */\n\tpublic setChoices>(...choices: RestOrArray): this {\n\t\tconst normalizedChoices = normalizeArray(choices);\n\t\tif (normalizedChoices.length > 0 && 'autocomplete' in this && this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tchoicesPredicate.parse(normalizedChoices);\n\n\t\tReflect.set(this, 'choices', []);\n\t\tthis.addChoices(normalizedChoices);\n\n\t\treturn this;\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandMentionableOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command mentionable option.\n */\nexport class SlashCommandMentionableOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Mentionable as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandMentionableOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandNumberOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\n\nconst numberValidator = s.number();\n\n/**\n * A slash command number option.\n */\n@mix(\n\tApplicationCommandNumericOptionMinMaxValueMixin,\n\tApplicationCommandOptionWithAutocompleteMixin,\n\tApplicationCommandOptionWithChoicesMixin,\n)\nexport class SlashCommandNumberOption\n\textends ApplicationCommandOptionBase\n\timplements ApplicationCommandNumericOptionMinMaxValueMixin\n{\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Number as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}\n\t */\n\tpublic setMaxValue(max: number): this {\n\t\tnumberValidator.parse(max);\n\n\t\tReflect.set(this, 'max_value', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}\n\t */\n\tpublic setMinValue(min: number): this {\n\t\tnumberValidator.parse(min);\n\n\t\tReflect.set(this, 'min_value', min);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandNumberOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this } as APIApplicationCommandNumberOption;\n\t}\n}\n\nexport interface SlashCommandNumberOption\n\textends ApplicationCommandNumericOptionMinMaxValueMixin,\n\t\tApplicationCommandOptionWithChoicesMixin,\n\t\tApplicationCommandOptionWithAutocompleteMixin {}\n","import { ApplicationCommandOptionType, type APIApplicationCommandRoleOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command role option.\n */\nexport class SlashCommandRoleOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic override readonly type = ApplicationCommandOptionType.Role as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandRoleOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandStringOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\n\nconst minLengthValidator = s.number().greaterThanOrEqual(0).lessThanOrEqual(6_000);\nconst maxLengthValidator = s.number().greaterThanOrEqual(1).lessThanOrEqual(6_000);\n\n/**\n * A slash command string option.\n */\n@mix(ApplicationCommandOptionWithAutocompleteMixin, ApplicationCommandOptionWithChoicesMixin)\nexport class SlashCommandStringOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.String as const;\n\n\t/**\n\t * The maximum length of this option.\n\t */\n\tpublic readonly max_length?: number;\n\n\t/**\n\t * The minimum length of this option.\n\t */\n\tpublic readonly min_length?: number;\n\n\t/**\n\t * Sets the maximum length of this string option.\n\t *\n\t * @param max - The maximum length this option can be\n\t */\n\tpublic setMaxLength(max: number): this {\n\t\tmaxLengthValidator.parse(max);\n\n\t\tReflect.set(this, 'max_length', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum length of this string option.\n\t *\n\t * @param min - The minimum length this option can be\n\t */\n\tpublic setMinLength(min: number): this {\n\t\tminLengthValidator.parse(min);\n\n\t\tReflect.set(this, 'min_length', min);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandStringOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this } as APIApplicationCommandStringOption;\n\t}\n}\n\nexport interface SlashCommandStringOption\n\textends ApplicationCommandOptionWithChoicesMixin,\n\t\tApplicationCommandOptionWithAutocompleteMixin {}\n","import { ApplicationCommandOptionType, type APIApplicationCommandUserOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command user option.\n */\nexport class SlashCommandUserOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.User as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandUserOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { assertReturnOfBuilder, validateMaxOptionsLength } from '../Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder';\nimport { SlashCommandAttachmentOption } from '../options/attachment.js';\nimport { SlashCommandBooleanOption } from '../options/boolean.js';\nimport { SlashCommandChannelOption } from '../options/channel.js';\nimport { SlashCommandIntegerOption } from '../options/integer.js';\nimport { SlashCommandMentionableOption } from '../options/mentionable.js';\nimport { SlashCommandNumberOption } from '../options/number.js';\nimport { SlashCommandRoleOption } from '../options/role.js';\nimport { SlashCommandStringOption } from '../options/string.js';\nimport { SlashCommandUserOption } from '../options/user.js';\nimport type { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * This mixin holds symbols that can be shared in slash command options.\n *\n * @typeParam TypeAfterAddingOptions - The type this class should return after adding an option.\n */\nexport class SharedSlashCommandOptions<\n\tTypeAfterAddingOptions extends SharedSlashCommandOptions,\n> {\n\tpublic readonly options!: ToAPIApplicationCommandOptions[];\n\n\t/**\n\t * Adds a boolean option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addBooleanOption(\n\t\tinput: SlashCommandBooleanOption | ((builder: SlashCommandBooleanOption) => SlashCommandBooleanOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandBooleanOption);\n\t}\n\n\t/**\n\t * Adds a user option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addUserOption(input: SlashCommandUserOption | ((builder: SlashCommandUserOption) => SlashCommandUserOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandUserOption);\n\t}\n\n\t/**\n\t * Adds a channel option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addChannelOption(\n\t\tinput: SlashCommandChannelOption | ((builder: SlashCommandChannelOption) => SlashCommandChannelOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandChannelOption);\n\t}\n\n\t/**\n\t * Adds a role option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addRoleOption(input: SlashCommandRoleOption | ((builder: SlashCommandRoleOption) => SlashCommandRoleOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandRoleOption);\n\t}\n\n\t/**\n\t * Adds an attachment option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addAttachmentOption(\n\t\tinput: SlashCommandAttachmentOption | ((builder: SlashCommandAttachmentOption) => SlashCommandAttachmentOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandAttachmentOption);\n\t}\n\n\t/**\n\t * Adds a mentionable option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addMentionableOption(\n\t\tinput: SlashCommandMentionableOption | ((builder: SlashCommandMentionableOption) => SlashCommandMentionableOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandMentionableOption);\n\t}\n\n\t/**\n\t * Adds a string option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addStringOption(\n\t\tinput: SlashCommandStringOption | ((builder: SlashCommandStringOption) => SlashCommandStringOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandStringOption);\n\t}\n\n\t/**\n\t * Adds an integer option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addIntegerOption(\n\t\tinput: SlashCommandIntegerOption | ((builder: SlashCommandIntegerOption) => SlashCommandIntegerOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandIntegerOption);\n\t}\n\n\t/**\n\t * Adds a number option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addNumberOption(\n\t\tinput: SlashCommandNumberOption | ((builder: SlashCommandNumberOption) => SlashCommandNumberOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandNumberOption);\n\t}\n\n\t/**\n\t * Where the actual adding magic happens. ✨\n\t *\n\t * @param input - The input. What else?\n\t * @param Instance - The instance of whatever is being added\n\t * @internal\n\t */\n\tprivate _sharedAddOptionMethod(\n\t\tinput: OptionBuilder | ((builder: OptionBuilder) => OptionBuilder),\n\t\tInstance: new () => OptionBuilder,\n\t): TypeAfterAddingOptions {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new Instance()) : input;\n\n\t\tassertReturnOfBuilder(result, Instance);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this as unknown as TypeAfterAddingOptions;\n\t}\n}\n","import {\n\tApplicationCommandOptionType,\n\ttype APIApplicationCommandSubcommandGroupOption,\n\ttype APIApplicationCommandSubcommandOption,\n} from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { assertReturnOfBuilder, validateMaxOptionsLength, validateRequiredParameters } from './Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder.js';\nimport type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase.js';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription.js';\nimport { SharedSlashCommandOptions } from './mixins/SharedSlashCommandOptions.js';\n\n/**\n * Represents a folder for subcommands.\n *\n * @see {@link https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups}\n */\n@mix(SharedNameAndDescription)\nexport class SlashCommandSubcommandGroupBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand group.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand group.\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The subcommands within this subcommand group.\n\t */\n\tpublic readonly options: SlashCommandSubcommandBuilder[] = [];\n\n\t/**\n\t * Adds a new subcommand to this group.\n\t *\n\t * @param input - A function that returns a subcommand builder or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t) {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIApplicationCommandSubcommandGroupOption {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.SubcommandGroup,\n\t\t\tname: this.name,\n\t\t\tname_localizations: this.name_localizations,\n\t\t\tdescription: this.description,\n\t\t\tdescription_localizations: this.description_localizations,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandGroupBuilder extends SharedNameAndDescription {}\n\n/**\n * A builder that creates API-compatible JSON data for slash command subcommands.\n *\n * @see {@link https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups}\n */\n@mix(SharedNameAndDescription, SharedSlashCommandOptions)\nexport class SlashCommandSubcommandBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand.\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The options within this subcommand.\n\t */\n\tpublic readonly options: ApplicationCommandOptionBase[] = [];\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIApplicationCommandSubcommandOption {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.Subcommand,\n\t\t\tname: this.name,\n\t\t\tname_localizations: this.name_localizations,\n\t\t\tdescription: this.description,\n\t\t\tdescription_localizations: this.description_localizations,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandOptions {}\n","import { assertReturnOfBuilder, validateMaxOptionsLength } from '../Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder.js';\nimport { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from '../SlashCommandSubcommands.js';\n\n/**\n * This mixin holds symbols that can be shared in slash subcommands.\n *\n * @typeParam TypeAfterAddingSubcommands - The type this class should return after adding a subcommand or subcommand group.\n */\nexport class SharedSlashCommandSubcommands<\n\tTypeAfterAddingSubcommands extends SharedSlashCommandSubcommands,\n> {\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\t/**\n\t * Adds a new subcommand group to this command.\n\t *\n\t * @param input - A function that returns a subcommand group builder or an already built builder\n\t */\n\tpublic addSubcommandGroup(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandGroupBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandGroupBuilder) => SlashCommandSubcommandGroupBuilder),\n\t): TypeAfterAddingSubcommands {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandGroupBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandGroupBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this as unknown as TypeAfterAddingSubcommands;\n\t}\n\n\t/**\n\t * Adds a new subcommand to this command.\n\t *\n\t * @param input - A function that returns a subcommand builder or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t): TypeAfterAddingSubcommands {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this as unknown as TypeAfterAddingSubcommands;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandType, ApplicationIntegrationType, InteractionContextType } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport type { ContextMenuCommandType } from './ContextMenuCommandBuilder.js';\n\nconst namePredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(32)\n\t.regex(/\\S/)\n\t.setValidationEnabled(isValidationEnabled);\nconst typePredicate = s\n\t.union([s.literal(ApplicationCommandType.User), s.literal(ApplicationCommandType.Message)])\n\t.setValidationEnabled(isValidationEnabled);\nconst booleanPredicate = s.boolean();\n\nexport function validateDefaultPermission(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport function validateName(name: unknown): asserts name is string {\n\tnamePredicate.parse(name);\n}\n\nexport function validateType(type: unknown): asserts type is ContextMenuCommandType {\n\ttypePredicate.parse(type);\n}\n\nexport function validateRequiredParameters(name: string, type: number) {\n\t// Assert name matches all conditions\n\tvalidateName(name);\n\n\t// Assert type is valid\n\tvalidateType(type);\n}\n\nconst dmPermissionPredicate = s.boolean().nullish();\n\nexport function validateDMPermission(value: unknown): asserts value is boolean | null | undefined {\n\tdmPermissionPredicate.parse(value);\n}\n\nconst memberPermissionPredicate = s\n\t.union([\n\t\ts.bigint().transform((value) => value.toString()),\n\t\ts\n\t\t\t.number()\n\t\t\t.safeInt()\n\t\t\t.transform((value) => value.toString()),\n\t\ts.string().regex(/^\\d+$/),\n\t])\n\t.nullish();\n\nexport function validateDefaultMemberPermissions(permissions: unknown) {\n\treturn memberPermissionPredicate.parse(permissions);\n}\n\nexport const contextsPredicate = s.array(\n\ts.nativeEnum(InteractionContextType).setValidationEnabled(isValidationEnabled),\n);\n\nexport const integrationTypesPredicate = s.array(\n\ts.nativeEnum(ApplicationIntegrationType).setValidationEnabled(isValidationEnabled),\n);\n","import type {\n\tApplicationCommandType,\n\tApplicationIntegrationType,\n\tInteractionContextType,\n\tLocaleString,\n\tLocalizationMap,\n\tPermissions,\n\tRESTPostAPIContextMenuApplicationCommandsJSONBody,\n} from 'discord-api-types/v10';\nimport type { RestOrArray } from '../../util/normalizeArray.js';\nimport { normalizeArray } from '../../util/normalizeArray.js';\nimport { validateLocale, validateLocalizationMap } from '../slashCommands/Assertions.js';\nimport {\n\tvalidateRequiredParameters,\n\tvalidateName,\n\tvalidateType,\n\tvalidateDefaultPermission,\n\tvalidateDefaultMemberPermissions,\n\tvalidateDMPermission,\n\tcontextsPredicate,\n\tintegrationTypesPredicate,\n} from './Assertions.js';\n\n/**\n * The type a context menu command can be.\n */\nexport type ContextMenuCommandType = ApplicationCommandType.Message | ApplicationCommandType.User;\n\n/**\n * A builder that creates API-compatible JSON data for context menu commands.\n */\nexport class ContextMenuCommandBuilder {\n\t/**\n\t * The name of this command.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The name localizations of this command.\n\t */\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\t/**\n\t * The type of this command.\n\t */\n\tpublic readonly type: ContextMenuCommandType = undefined!;\n\n\t/**\n\t * The contexts for this command.\n\t */\n\tpublic readonly contexts?: InteractionContextType[];\n\n\t/**\n\t * Whether this command is enabled by default when the application is added to a guild.\n\t *\n\t * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.\n\t */\n\tpublic readonly default_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The set of permissions represented as a bit set for the command.\n\t */\n\tpublic readonly default_member_permissions: Permissions | null | undefined = undefined;\n\n\t/**\n\t * Indicates whether the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This property is only for global commands.\n\t * @deprecated\n\t * Use {@link ContextMenuCommandBuilder.contexts} instead.\n\t */\n\tpublic readonly dm_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The integration types for this command.\n\t */\n\tpublic readonly integration_types?: ApplicationIntegrationType[];\n\n\t/**\n\t * Sets the contexts of this command.\n\t *\n\t * @param contexts - The contexts\n\t */\n\tpublic setContexts(...contexts: RestOrArray) {\n\t\tReflect.set(this, 'contexts', contextsPredicate.parse(normalizeArray(contexts)));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets integration types of this command.\n\t *\n\t * @param integrationTypes - The integration types\n\t */\n\tpublic setIntegrationTypes(...integrationTypes: RestOrArray) {\n\t\tReflect.set(this, 'integration_types', integrationTypesPredicate.parse(normalizeArray(integrationTypes)));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name of this command.\n\t *\n\t * @param name - The name to use\n\t */\n\tpublic setName(name: string) {\n\t\t// Assert the name matches the conditions\n\t\tvalidateName(name);\n\n\t\tReflect.set(this, 'name', name);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the type of this command.\n\t *\n\t * @param type - The type to use\n\t */\n\tpublic setType(type: ContextMenuCommandType) {\n\t\t// Assert the type is valid\n\t\tvalidateType(type);\n\n\t\tReflect.set(this, 'type', type);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether the command is enabled by default when the application is added to a guild.\n\t *\n\t * @remarks\n\t * If set to `false`, you will have to later `PUT` the permissions for this command.\n\t * @param value - Whether to enable this command by default\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.\n\t */\n\tpublic setDefaultPermission(value: boolean) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDefaultPermission(value);\n\n\t\tReflect.set(this, 'default_permission', value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the default permissions a member should have in order to run this command.\n\t *\n\t * @remarks\n\t * You can set this to `'0'` to disable the command by default.\n\t * @param permissions - The permissions bit field to set\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t */\n\tpublic setDefaultMemberPermissions(permissions: Permissions | bigint | number | null | undefined) {\n\t\t// Assert the value and parse it\n\t\tconst permissionValue = validateDefaultMemberPermissions(permissions);\n\n\t\tReflect.set(this, 'default_member_permissions', permissionValue);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets if the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This method is only for global commands.\n\t * @param enabled - Whether the command should be enabled in direct messages\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated Use {@link ContextMenuCommandBuilder.setContexts} instead.\n\t */\n\tpublic setDMPermission(enabled: boolean | null | undefined) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDMPermission(enabled);\n\n\t\tReflect.set(this, 'dm_permission', enabled);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a name localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedName - The localized name for the given `locale`\n\t */\n\tpublic setNameLocalization(locale: LocaleString, localizedName: string | null) {\n\t\tif (!this.name_localizations) {\n\t\t\tReflect.set(this, 'name_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedName === null) {\n\t\t\tthis.name_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateName(localizedName);\n\n\t\tthis.name_localizations![parsedLocale] = localizedName;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name localizations for this command.\n\t *\n\t * @param localizedNames - The object of localized names to set\n\t */\n\tpublic setNameLocalizations(localizedNames: LocalizationMap | null) {\n\t\tif (localizedNames === null) {\n\t\t\tReflect.set(this, 'name_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'name_localizations', {});\n\n\t\tfor (const args of Object.entries(localizedNames))\n\t\t\tthis.setNameLocalization(...(args as [LocaleString, string | null]));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): RESTPostAPIContextMenuApplicationCommandsJSONBody {\n\t\tvalidateRequiredParameters(this.name, this.type);\n\n\t\tvalidateLocalizationMap(this.name_localizations);\n\n\t\treturn { ...this };\n\t}\n}\n","import type { APIEmbed } from 'discord-api-types/v10';\n\n/**\n * Calculates the length of the embed.\n *\n * @param data - The embed data to check\n */\nexport function embedLength(data: APIEmbed) {\n\treturn (\n\t\t(data.title?.length ?? 0) +\n\t\t(data.description?.length ?? 0) +\n\t\t(data.fields?.reduce((prev, curr) => prev + curr.name.length + curr.value.length, 0) ?? 0) +\n\t\t(data.footer?.text.length ?? 0) +\n\t\t(data.author?.name.length ?? 0)\n\t);\n}\n"],"mappings":"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","names":["Assertions_exports","s","s","ComponentType","ComponentType","ComponentType","ComponentType","ComponentType","SelectMenuDefaultValueType","ComponentType","SelectMenuDefaultValueType","ComponentType","SelectMenuDefaultValueType","ComponentType","SelectMenuDefaultValueType","ComponentType","ComponentType","ComponentType","SelectMenuDefaultValueType","ComponentType","SelectMenuDefaultValueType","ComponentType","Assertions_exports","placeholderValidator","s","s","placeholderValidator","ComponentType","placeholderValidator","ComponentType","Assertions_exports","descriptionPredicate","s","ComponentType","ComponentType","descriptionPredicate","s","descriptionPredicate","ComponentType","ComponentType","ComponentType","ComponentType","ComponentType","ComponentType","ComponentType","ComponentType","descriptionPredicate","ComponentType","ComponentType","ComponentType","ComponentType","ComponentType","Assertions_exports","validateRequiredParameters","s","s","validateRequiredParameters","validateRequiredParameters","Assertions_exports","assertReturnOfBuilder","validateRequiredParameters","s","s","descriptionPredicate","validateRequiredParameters","assertReturnOfBuilder","mix","validateRequiredParameters","validateRequiredParameters","ApplicationCommandOptionType","ApplicationCommandOptionType","ApplicationCommandOptionType","s","ChannelType","ChannelType","s","ApplicationCommandOptionType","s","ApplicationCommandOptionType","mix","s","booleanPredicate","s","s","ApplicationCommandOptionType","s","ApplicationCommandOptionType","s","ApplicationCommandOptionType","mix","ApplicationCommandOptionType","ApplicationCommandOptionType","s","ApplicationCommandOptionType","mix","numberValidator","s","ApplicationCommandOptionType","mix","ApplicationCommandOptionType","ApplicationCommandOptionType","s","ApplicationCommandOptionType","mix","minLengthValidator","s","maxLengthValidator","ApplicationCommandOptionType","mix","ApplicationCommandOptionType","ApplicationCommandOptionType","assertReturnOfBuilder","ApplicationCommandOptionType","mix","assertReturnOfBuilder","validateRequiredParameters","ApplicationCommandOptionType","mix","assertReturnOfBuilder","mix","Assertions_exports","contextsPredicate","integrationTypesPredicate","validateDMPermission","validateDefaultMemberPermissions","validateDefaultPermission","validateName","validateRequiredParameters","s","ApplicationCommandType","ApplicationIntegrationType","InteractionContextType","namePredicate","s","ApplicationCommandType","booleanPredicate","validateDefaultPermission","validateName","validateRequiredParameters","dmPermissionPredicate","validateDMPermission","memberPermissionPredicate","validateDefaultMemberPermissions","contextsPredicate","InteractionContextType","integrationTypesPredicate","ApplicationIntegrationType","contextsPredicate","integrationTypesPredicate","validateName","validateDefaultPermission","validateDefaultMemberPermissions","validateDMPermission","validateRequiredParameters"]} \ No newline at end of file +{"version":3,"sources":["../src/messages/embed/Assertions.ts","../src/util/validation.ts","../src/util/normalizeArray.ts","../src/messages/embed/Embed.ts","../src/index.ts","../src/components/Assertions.ts","../src/components/selectMenu/StringSelectMenuOption.ts","../src/components/ActionRow.ts","../src/components/Component.ts","../src/components/Components.ts","../src/components/button/Button.ts","../src/components/fileUpload/FileUpload.ts","../src/components/fileUpload/Assertions.ts","../src/components/label/Label.ts","../src/components/selectMenu/ChannelSelectMenu.ts","../src/components/textInput/Assertions.ts","../src/components/selectMenu/BaseSelectMenu.ts","../src/components/selectMenu/MentionableSelectMenu.ts","../src/components/selectMenu/RoleSelectMenu.ts","../src/components/selectMenu/StringSelectMenu.ts","../src/components/selectMenu/Assertions.ts","../src/components/selectMenu/UserSelectMenu.ts","../src/components/textInput/TextInput.ts","../src/components/label/Assertions.ts","../src/components/v2/Container.ts","../src/components/v2/Assertions.ts","../src/components/v2/Thumbnail.ts","../src/components/v2/File.ts","../src/components/v2/Separator.ts","../src/components/v2/TextDisplay.ts","../src/components/v2/MediaGallery.ts","../src/components/v2/MediaGalleryItem.ts","../src/components/v2/Section.ts","../src/interactions/modals/Modal.ts","../src/interactions/modals/Assertions.ts","../src/interactions/slashCommands/Assertions.ts","../src/interactions/slashCommands/SlashCommandBuilder.ts","../src/interactions/slashCommands/mixins/NameAndDescription.ts","../src/interactions/slashCommands/mixins/SharedSlashCommand.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/ApplicationCommandOptionWithAutocompleteMixin.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesMixin.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/slashCommands/SlashCommandSubcommands.ts","../src/interactions/slashCommands/mixins/SharedSubcommands.ts","../src/interactions/contextMenuCommands/Assertions.ts","../src/interactions/contextMenuCommands/ContextMenuCommandBuilder.ts","../src/util/componentUtil.ts"],"sourcesContent":["import { s } from '@sapphire/shapeshift';\nimport type { APIEmbedField } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\n\nexport const fieldNamePredicate = s.string().lengthLessThanOrEqual(256).setValidationEnabled(isValidationEnabled);\n\nexport const fieldValuePredicate = s.string().lengthLessThanOrEqual(1_024).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\n\t.lengthGreaterThanOrEqual(1)\n\t.nullable()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const imageURLPredicate = s\n\t.string()\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:', 'attachment:'],\n\t})\n\t.nullish()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const urlPredicate = s\n\t.string()\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:'],\n\t})\n\t.nullish()\n\t.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\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(255)\n\t.setValidationEnabled(isValidationEnabled);\nexport const colorPredicate = s\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(0xffffff)\n\t.or(s.tuple([RGBPredicate, RGBPredicate, RGBPredicate]))\n\t.nullable()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const descriptionPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(4_096)\n\t.nullable()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const footerTextPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(2_048)\n\t.nullable()\n\t.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\n\t.lengthGreaterThanOrEqual(1)\n\t.nullable()\n\t.setValidationEnabled(isValidationEnabled);\n","let validate = true;\n\n/**\n * Enables validators.\n *\n * @returns Whether validation is occurring.\n */\nexport function enableValidators() {\n\treturn (validate = true);\n}\n\n/**\n * Disables validators.\n *\n * @returns Whether validation is occurring.\n */\nexport function disableValidators() {\n\treturn (validate = false);\n}\n\n/**\n * Checks whether validation is occurring.\n */\nexport function isValidationEnabled() {\n\treturn validate;\n}\n","/**\n * Normalizes data that is a rest parameter or an array into an array with a depth of 1.\n *\n * @typeParam ItemType - The data that must satisfy {@link RestOrArray}.\n * @param arr - The (possibly variadic) data to normalize\n */\nexport function normalizeArray(arr: RestOrArray): ItemType[] {\n\tif (Array.isArray(arr[0])) return [...arr[0]];\n\treturn arr as ItemType[];\n}\n\n/**\n * Represents data that may be an array or came from a rest parameter.\n *\n * @remarks\n * This type is used throughout builders to ensure both an array and variadic arguments\n * may be used. It is normalized with {@link normalizeArray}.\n */\nexport type RestOrArray = Type[] | [Type[]];\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\n/**\n * A tuple satisfying the RGB color model.\n *\n * @see {@link https://developer.mozilla.org/docs/Glossary/RGB}\n */\nexport type RGBTuple = [red: number, green: number, blue: number];\n\n/**\n * The base icon data typically used in payloads.\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\n/**\n * Represents the author data of an embed.\n */\nexport interface EmbedAuthorData extends IconData, Omit {}\n\n/**\n * Represents the author options of an embed.\n */\nexport interface EmbedAuthorOptions extends Omit {}\n\n/**\n * Represents the footer data of an embed.\n */\nexport interface EmbedFooterData extends IconData, Omit {}\n\n/**\n * Represents the footer options of an embed.\n */\nexport interface EmbedFooterOptions extends Omit {}\n\n/**\n * Represents the image data of an embed.\n */\nexport interface EmbedImageData extends Omit {\n\t/**\n\t * The proxy URL for the image.\n\t */\n\tproxyURL?: string;\n}\n\n/**\n * A builder that creates API-compatible JSON data for embeds.\n */\nexport class EmbedBuilder {\n\t/**\n\t * The API data associated with this embed.\n\t */\n\tpublic readonly data: APIEmbed;\n\n\t/**\n\t * Creates a new embed from API data.\n\t *\n\t * @param data - The API data to create this embed with\n\t */\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\tconst normalizedFields = normalizeArray(fields);\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(normalizedFields.length, this.data.fields);\n\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(normalizedFields);\n\n\t\tif (this.data.fields) this.data.fields.push(...normalizedFields);\n\t\telse this.data.fields = normalizedFields;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts fields for this embed.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t * The maximum amount of fields that can be added is 25.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing fields of an embed.\n\t * @example\n\t * Remove the first field:\n\t * ```ts\n\t * embed.spliceFields(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n fields:\n\t * ```ts\n\t * const n = 4;\n\t * embed.spliceFields(0, n);\n\t * ```\n\t * @example\n\t * Remove the last field:\n\t * ```ts\n\t * embed.spliceFields(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of fields to remove\n\t * @param fields - The replacing field objects\n\t */\n\tpublic spliceFields(index: number, deleteCount: number, ...fields: APIEmbedField[]): this {\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(fields.length - deleteCount, this.data.fields);\n\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(fields);\n\t\tif (this.data.fields) this.data.fields.splice(index, deleteCount, ...fields);\n\t\telse this.data.fields = fields;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the fields for this embed.\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): this {\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 to use\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 to use\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 to use\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 footer to use\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 image URL to use\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 thumbnail URL to use\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 to use\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 for this embed.\n\t *\n\t * @param title - The title to use\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 to use\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 * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIEmbed {\n\t\treturn { ...this.data };\n\t}\n}\n","export * as EmbedAssertions from './messages/embed/Assertions.js';\nexport * from './messages/embed/Embed.js';\n// TODO: Consider removing this dep in the next major version\nexport * from '@discordjs/formatters';\n\nexport * as ComponentAssertions from './components/Assertions.js';\nexport * from './components/ActionRow.js';\nexport * from './components/button/Button.js';\nexport * from './components/Component.js';\nexport * from './components/Components.js';\nexport * from './components/textInput/TextInput.js';\nexport * as TextInputAssertions from './components/textInput/Assertions.js';\nexport * from './interactions/modals/Modal.js';\nexport * as ModalAssertions from './interactions/modals/Assertions.js';\n\nexport * from './components/selectMenu/BaseSelectMenu.js';\nexport * from './components/selectMenu/ChannelSelectMenu.js';\nexport * from './components/selectMenu/MentionableSelectMenu.js';\nexport * from './components/selectMenu/RoleSelectMenu.js';\nexport * from './components/selectMenu/StringSelectMenu.js';\n// TODO: Remove those aliases in v2\nexport {\n\t/**\n\t * @deprecated Will be removed in the next major version, use {@link StringSelectMenuBuilder} instead.\n\t */\n\tStringSelectMenuBuilder as SelectMenuBuilder,\n} from './components/selectMenu/StringSelectMenu.js';\nexport {\n\t/**\n\t * @deprecated Will be removed in the next major version, use {@link StringSelectMenuOptionBuilder} instead.\n\t */\n\tStringSelectMenuOptionBuilder as SelectMenuOptionBuilder,\n} from './components/selectMenu/StringSelectMenuOption.js';\nexport * as SelectMenuAssertions from './components/selectMenu/Assertions.js';\nexport * from './components/selectMenu/StringSelectMenuOption.js';\nexport * from './components/selectMenu/UserSelectMenu.js';\n\nexport * from './components/fileUpload/FileUpload.js';\nexport * as FileUploadAssertions from './components/fileUpload/Assertions.js';\n\nexport * from './components/label/Label.js';\nexport * as LabelAssertions from './components/label/Assertions.js';\n\nexport * as ComponentsV2Assertions from './components/v2/Assertions.js';\nexport * from './components/v2/Container.js';\nexport * from './components/v2/File.js';\nexport * from './components/v2/MediaGallery.js';\nexport * from './components/v2/MediaGalleryItem.js';\nexport * from './components/v2/Section.js';\nexport * from './components/v2/Separator.js';\nexport * from './components/v2/TextDisplay.js';\nexport * from './components/v2/Thumbnail.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/ApplicationCommandOptionWithAutocompleteMixin.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesMixin.js';\nexport * from './interactions/slashCommands/mixins/NameAndDescription.js';\nexport * from './interactions/slashCommands/mixins/SharedSlashCommandOptions.js';\nexport * from './interactions/slashCommands/mixins/SharedSubcommands.js';\nexport * from './interactions/slashCommands/mixins/SharedSlashCommand.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';\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 * @privateRemarks This needs to explicitly be `string` so it is not typed as a \"const string\" that gets injected by esbuild.\n */\nexport const version = '1.13.1' as string;\n","import { s } from '@sapphire/shapeshift';\nimport { ButtonStyle, ChannelType, type APIMessageComponentEmoji } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../util/validation.js';\nimport { StringSelectMenuOptionBuilder } from './selectMenu/StringSelectMenuOption.js';\n\nexport const idValidator = s\n\t.number()\n\t.safeInt()\n\t.greaterThanOrEqual(1)\n\t.lessThan(4_294_967_296) // 2^32 - 1\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const customIdValidator = s\n\t.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()\n\t.strict()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const disabledValidator = s.boolean();\n\nexport const buttonLabelValidator = s\n\t.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\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(25)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const labelValueDescriptionValidator = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(100)\n\t.setValidationEnabled(isValidationEnabled);\n\n/**\n * @deprecated Replaced with selectMenuStringOptionPredicate.\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\n\t.array()\n\t.lengthGreaterThanOrEqual(0)\n\t.setValidationEnabled(isValidationEnabled);\nexport const optionsLengthValidator = s\n\t.number()\n\t.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\n\t.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\tskuId?: string,\n\turl?: string,\n) {\n\tif (style === ButtonStyle.Premium) {\n\t\tif (!skuId) {\n\t\t\tthrow new RangeError('Premium buttons must have an SKU id.');\n\t\t}\n\n\t\tif (customId || label || url || emoji) {\n\t\t\tthrow new RangeError('Premium buttons cannot have a custom id, label, URL, or emoji.');\n\t\t}\n\t} else {\n\t\tif (skuId) {\n\t\t\tthrow new RangeError('Non-premium buttons must not have an SKU id.');\n\t\t}\n\n\t\tif (url && customId) {\n\t\t\tthrow new RangeError('URL and custom id are mutually exclusive.');\n\t\t}\n\n\t\tif (!label && !emoji) {\n\t\t\tthrow new RangeError('Non-premium buttons must have a label and/or an emoji.');\n\t\t}\n\n\t\tif (style === ButtonStyle.Link) {\n\t\t\tif (!url) {\n\t\t\t\tthrow new RangeError('Link buttons must have a URL.');\n\t\t\t}\n\t\t} else if (url) {\n\t\t\tthrow new RangeError('Non-premium and non-link buttons cannot have a URL.');\n\t\t}\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 * A builder that creates API-compatible JSON data for string select menu options.\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 for this option.\n\t *\n\t * @param label - The label to use\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 for this option.\n\t *\n\t * @param value - The value to use\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 for this option.\n\t *\n\t * @param description - The description to use\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 for this option.\n\t *\n\t * @param emoji - The emoji to use\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 BaseSelectMenuBuilder.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 APIComponentInMessageActionRow,\n\ttype APIComponentInModalActionRow,\n\ttype APIComponentInActionRow,\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\n/**\n * The builders that may be used for modals.\n */\nexport type ModalComponentBuilder = ActionRowBuilder | ModalActionRowComponentBuilder;\n\n/**\n * The builders that may be used within an action row for messages.\n */\nexport type MessageActionRowComponentBuilder =\n\t| ButtonBuilder\n\t| ChannelSelectMenuBuilder\n\t| MentionableSelectMenuBuilder\n\t| RoleSelectMenuBuilder\n\t| StringSelectMenuBuilder\n\t| UserSelectMenuBuilder;\n\n/**\n * The builders that may be used within an action row for modals.\n */\nexport type ModalActionRowComponentBuilder = TextInputBuilder;\n\n/**\n * Any builder.\n */\nexport type AnyComponentBuilder = MessageActionRowComponentBuilder | ModalActionRowComponentBuilder;\n\n/**\n * A builder that creates API-compatible JSON data for action rows.\n *\n * @typeParam ComponentType - 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: ComponentType[];\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 ComponentType[];\n\t}\n\n\t/**\n\t * Adds components to this action row.\n\t *\n\t * @param components - The components to add\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 components for this action row.\n\t *\n\t * @param components - The components to set\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\tAPIComponentInActionRow,\n\tAPIBaseComponent,\n\tComponentType,\n\tAPIMessageComponent,\n\tAPIModalComponent,\n} from 'discord-api-types/v10';\nimport { idValidator } from './Assertions';\n\n/**\n * Any action row component data represented as an object.\n */\nexport type AnyAPIActionRowComponent =\n\t| APIActionRowComponent\n\t| APIComponentInActionRow\n\t| APIMessageComponent\n\t| APIModalComponent;\n\n/**\n * The base component builder that contains common symbols for all sorts of components.\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 builder to API-compatible JSON data.\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\t/**\n\t * Constructs a new kind of component.\n\t *\n\t * @param data - The data to construct a component out of\n\t */\n\tpublic constructor(data: Partial) {\n\t\tthis.data = data;\n\t}\n\n\t/**\n\t * Sets the id (not the custom id) for this component.\n\t *\n\t * @param id - The id for this component\n\t */\n\tpublic setId(id: number) {\n\t\tthis.data.id = idValidator.parse(id);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the id of this component, defaulting to a default incremented id.\n\t */\n\tpublic clearId() {\n\t\tthis.data.id = undefined;\n\t\treturn this;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport { ComponentType, type APIMessageComponent, type APIModalComponent } from 'discord-api-types/v10';\nimport {\n\tActionRowBuilder,\n\ttype MessageActionRowComponentBuilder,\n\ttype AnyComponentBuilder,\n\ttype ModalComponentBuilder,\n} from './ActionRow.js';\nimport { ComponentBuilder } from './Component.js';\nimport { ButtonBuilder } from './button/Button.js';\nimport { FileUploadBuilder } from './fileUpload/FileUpload.js';\nimport { LabelBuilder } from './label/Label.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';\nimport { ContainerBuilder } from './v2/Container.js';\nimport { FileBuilder } from './v2/File.js';\nimport { MediaGalleryBuilder } from './v2/MediaGallery.js';\nimport { SectionBuilder } from './v2/Section.js';\nimport { SeparatorBuilder } from './v2/Separator.js';\nimport { TextDisplayBuilder } from './v2/TextDisplay.js';\nimport { ThumbnailBuilder } from './v2/Thumbnail.js';\n\n/**\n * The builders that may be used for messages.\n */\nexport type MessageComponentBuilder =\n\t| ActionRowBuilder\n\t| ContainerBuilder\n\t| FileBuilder\n\t| MediaGalleryBuilder\n\t| MessageActionRowComponentBuilder\n\t| SectionBuilder\n\t| SeparatorBuilder\n\t| TextDisplayBuilder\n\t| ThumbnailBuilder;\n\n/**\n * Components here are mapped to their respective builder.\n */\nexport interface MappedComponentTypes {\n\t/**\n\t * The action row component type is associated with an {@link ActionRowBuilder}.\n\t */\n\t[ComponentType.ActionRow]: ActionRowBuilder;\n\t/**\n\t * The button component type is associated with a {@link ButtonBuilder}.\n\t */\n\t[ComponentType.Button]: ButtonBuilder;\n\t/**\n\t * The string select component type is associated with a {@link StringSelectMenuBuilder}.\n\t */\n\t[ComponentType.StringSelect]: StringSelectMenuBuilder;\n\t/**\n\t * The text input component type is associated with a {@link TextInputBuilder}.\n\t */\n\t[ComponentType.TextInput]: TextInputBuilder;\n\t/**\n\t * The user select component type is associated with a {@link UserSelectMenuBuilder}.\n\t */\n\t[ComponentType.UserSelect]: UserSelectMenuBuilder;\n\t/**\n\t * The role select component type is associated with a {@link RoleSelectMenuBuilder}.\n\t */\n\t[ComponentType.RoleSelect]: RoleSelectMenuBuilder;\n\t/**\n\t * The mentionable select component type is associated with a {@link MentionableSelectMenuBuilder}.\n\t */\n\t[ComponentType.MentionableSelect]: MentionableSelectMenuBuilder;\n\t/**\n\t * The channel select component type is associated with a {@link ChannelSelectMenuBuilder}.\n\t */\n\t[ComponentType.ChannelSelect]: ChannelSelectMenuBuilder;\n\t/**\n\t * The file component type is associated with a {@link FileBuilder}.\n\t */\n\t[ComponentType.File]: FileBuilder;\n\t/**\n\t * The separator component type is associated with a {@link SeparatorBuilder}.\n\t */\n\t[ComponentType.Separator]: SeparatorBuilder;\n\t/**\n\t * The container component type is associated with a {@link ContainerBuilder}.\n\t */\n\t[ComponentType.Container]: ContainerBuilder;\n\t/**\n\t * The text display component type is associated with a {@link TextDisplayBuilder}.\n\t */\n\t[ComponentType.TextDisplay]: TextDisplayBuilder;\n\t/**\n\t * The thumbnail component type is associated with a {@link ThumbnailBuilder}.\n\t */\n\t[ComponentType.Thumbnail]: ThumbnailBuilder;\n\t/**\n\t * The section component type is associated with a {@link SectionBuilder}.\n\t */\n\t[ComponentType.Section]: SectionBuilder;\n\t/**\n\t * The media gallery component type is associated with a {@link MediaGalleryBuilder}.\n\t */\n\t[ComponentType.MediaGallery]: MediaGalleryBuilder;\n\t/**\n\t * The label component type is associated with a {@link LabelBuilder}.\n\t */\n\t[ComponentType.Label]: LabelBuilder;\n\t/**\n\t * The file upload component type is associated with a {@link FileUploadBuilder}.\n\t */\n\t[ComponentType.FileUpload]: FileUploadBuilder;\n}\n\n/**\n * Factory for creating components from API data.\n *\n * @typeParam ComponentType - The type of component to use\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-constituents\n\tdata: (APIModalComponent | APIMessageComponent) & { type: ComponentType },\n): MappedComponentTypes[ComponentType];\n\n/**\n * Factory for creating components from API data.\n *\n * @typeParam ComponentBuilder - The type of component to use\n * @param data - The API data to transform to a component class\n */\nexport function createComponentBuilder(\n\tdata: ComponentBuilder,\n): ComponentBuilder;\n\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\tcase ComponentType.File:\n\t\t\treturn new FileBuilder(data);\n\t\tcase ComponentType.Container:\n\t\t\treturn new ContainerBuilder(data);\n\t\tcase ComponentType.Section:\n\t\t\treturn new SectionBuilder(data);\n\t\tcase ComponentType.Separator:\n\t\t\treturn new SeparatorBuilder(data);\n\t\tcase ComponentType.TextDisplay:\n\t\t\treturn new TextDisplayBuilder(data);\n\t\tcase ComponentType.Thumbnail:\n\t\t\treturn new ThumbnailBuilder(data);\n\t\tcase ComponentType.MediaGallery:\n\t\t\treturn new MediaGalleryBuilder(data);\n\t\tcase ComponentType.Label:\n\t\t\treturn new LabelBuilder(data);\n\t\tcase ComponentType.FileUpload:\n\t\t\treturn new FileUploadBuilder(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\nfunction isBuilder>(\n\tbuilder: unknown,\n\tConstructor: new () => Builder,\n): builder is Builder {\n\treturn builder instanceof Constructor;\n}\n\nexport function resolveBuilder, Builder extends JSONEncodable>(\n\tbuilder: Builder | ComponentType | ((builder: Builder) => Builder),\n\tConstructor: new (data?: ComponentType) => Builder,\n) {\n\tif (isBuilder(builder, Constructor)) {\n\t\treturn builder;\n\t}\n\n\tif (typeof builder === 'function') {\n\t\treturn builder(new Constructor());\n\t}\n\n\treturn new Constructor(builder);\n}\n","import {\n\tComponentType,\n\ttype APIButtonComponent,\n\ttype APIButtonComponentWithCustomId,\n\ttype APIButtonComponentWithSKUId,\n\ttype APIButtonComponentWithURL,\n\ttype APIMessageComponentEmoji,\n\ttype ButtonStyle,\n\ttype Snowflake,\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 * A builder that creates API-compatible JSON data for buttons.\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 to use\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 use\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\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 SKU id that represents a purchasable SKU for this button.\n\t *\n\t * @remarks Only available when using premium-style buttons.\n\t * @param skuId - The SKU id to use\n\t */\n\tpublic setSKUId(skuId: Snowflake) {\n\t\t(this.data as APIButtonComponentWithSKUId).sku_id = skuId;\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 use\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\t(this.data as Exclude).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 use\n\t */\n\tpublic setLabel(label: string) {\n\t\t(this.data as Exclude).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\t(this.data as Exclude).label,\n\t\t\t(this.data as Exclude).emoji,\n\t\t\t(this.data as APIButtonComponentWithCustomId).custom_id,\n\t\t\t(this.data as APIButtonComponentWithSKUId).sku_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 APIFileUploadComponent, ComponentType } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component.js';\nimport { fileUploadPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for file uploads.\n */\nexport class FileUploadBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new file upload.\n\t *\n\t * @param data - The API data to create this file upload with\n\t * @example\n\t * Creating a file upload from an API data object:\n\t * ```ts\n\t * const fileUpload = new FileUploadBuilder({\n\t * \tcustom_id: \"file_upload\",\n\t * min_values: 2,\n\t * max_values: 5,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a file upload using setters and API data:\n\t * ```ts\n\t * const fileUpload = new FileUploadBuilder({\n\t * \tcustom_id: \"file_upload\",\n\t * min_values: 2,\n\t * max_values: 5,\n\t * }).setRequired();\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({ type: ComponentType.FileUpload, ...data });\n\t}\n\n\t/**\n\t * Sets the custom id for this file upload.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customId;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum number of file uploads required.\n\t *\n\t * @param minValues - The minimum values that must be uploaded\n\t */\n\tpublic setMinValues(minValues: number) {\n\t\tthis.data.min_values = minValues;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the minimum values.\n\t */\n\tpublic clearMinValues() {\n\t\tthis.data.min_values = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum number of file uploads required.\n\t *\n\t * @param maxValues - The maximum values that can be uploaded\n\t */\n\tpublic setMaxValues(maxValues: number) {\n\t\tthis.data.max_values = maxValues;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the maximum values.\n\t */\n\tpublic clearMaxValues() {\n\t\tthis.data.max_values = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this file upload is required.\n\t *\n\t * @param required - Whether this file upload is required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = required;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIFileUploadComponent {\n\t\tfileUploadPredicate.parse(this.data);\n\t\treturn this.data as APIFileUploadComponent;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { customIdValidator, idValidator } from '../Assertions.js';\n\nexport const fileUploadPredicate = s.object({\n\ttype: s.literal(ComponentType.FileUpload),\n\tid: idValidator.optional(),\n\tcustom_id: customIdValidator,\n\tmin_values: s.number().greaterThanOrEqual(0).lessThanOrEqual(10).optional(),\n\tmax_values: s.number().greaterThanOrEqual(1).lessThanOrEqual(10).optional(),\n\trequired: s.boolean().optional(),\n});\n","import type {\n\tAPIChannelSelectComponent,\n\tAPIFileUploadComponent,\n\tAPILabelComponent,\n\tAPIMentionableSelectComponent,\n\tAPIRoleSelectComponent,\n\tAPIStringSelectComponent,\n\tAPITextInputComponent,\n\tAPIUserSelectComponent,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component.js';\nimport { createComponentBuilder, resolveBuilder } from '../Components.js';\nimport { FileUploadBuilder } from '../fileUpload/FileUpload.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';\nimport { labelPredicate } from './Assertions.js';\n\nexport interface LabelBuilderData extends Partial> {\n\tcomponent?:\n\t\t| ChannelSelectMenuBuilder\n\t\t| FileUploadBuilder\n\t\t| MentionableSelectMenuBuilder\n\t\t| RoleSelectMenuBuilder\n\t\t| StringSelectMenuBuilder\n\t\t| TextInputBuilder\n\t\t| UserSelectMenuBuilder;\n}\n\n/**\n * A builder that creates API-compatible JSON data for labels.\n */\nexport class LabelBuilder extends ComponentBuilder {\n\t/**\n\t * @internal\n\t */\n\tpublic override readonly data: LabelBuilderData;\n\n\t/**\n\t * Creates a new label.\n\t *\n\t * @param data - The API data to create this label with\n\t * @example\n\t * Creating a label from an API data object:\n\t * ```ts\n\t * const label = new LabelBuilder({\n\t * \tlabel: \"label\",\n\t * \tcomponent,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a label using setters and API data:\n\t * ```ts\n\t * const label = new LabelBuilder({\n\t * \tlabel: 'label',\n\t * \tcomponent,\n\t * }).setLabel('new text');\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({ type: ComponentType.Label });\n\n\t\tconst { component, ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...rest,\n\t\t\tcomponent: component ? createComponentBuilder(component) : undefined,\n\t\t\ttype: ComponentType.Label,\n\t\t};\n\t}\n\n\t/**\n\t * Sets the label for this label.\n\t *\n\t * @param label - The label to use\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = label;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description for this label.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = description;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description for this label.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a string select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setStringSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIStringSelectComponent\n\t\t\t| StringSelectMenuBuilder\n\t\t\t| ((builder: StringSelectMenuBuilder) => StringSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, StringSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a user select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setUserSelectMenuComponent(\n\t\tinput: APIUserSelectComponent | UserSelectMenuBuilder | ((builder: UserSelectMenuBuilder) => UserSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, UserSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a role select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setRoleSelectMenuComponent(\n\t\tinput: APIRoleSelectComponent | RoleSelectMenuBuilder | ((builder: RoleSelectMenuBuilder) => RoleSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, RoleSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a mentionable select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setMentionableSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIMentionableSelectComponent\n\t\t\t| MentionableSelectMenuBuilder\n\t\t\t| ((builder: MentionableSelectMenuBuilder) => MentionableSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, MentionableSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a channel select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setChannelSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIChannelSelectComponent\n\t\t\t| ChannelSelectMenuBuilder\n\t\t\t| ((builder: ChannelSelectMenuBuilder) => ChannelSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, ChannelSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a text input component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setTextInputComponent(\n\t\tinput: APITextInputComponent | TextInputBuilder | ((builder: TextInputBuilder) => TextInputBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, TextInputBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a file upload component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setFileUploadComponent(\n\t\tinput: APIFileUploadComponent | FileUploadBuilder | ((builder: FileUploadBuilder) => FileUploadBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, FileUploadBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APILabelComponent {\n\t\tconst { component, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...rest,\n\t\t\t// The label predicate validates the component.\n\t\t\tcomponent: component?.toJSON(),\n\t\t};\n\n\t\tlabelPredicate.parse(data);\n\n\t\treturn data as APILabelComponent;\n\t}\n}\n","import {\n\ttype APIChannelSelectComponent,\n\ttype ChannelType,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { channelTypesValidator, customIdValidator, optionsLengthValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for channel select menus.\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\t/**\n\t * Adds channel types to this select menu.\n\t *\n\t * @param types - The channel types to use\n\t */\n\tpublic addChannelTypes(...types: RestOrArray) {\n\t\tconst normalizedTypes = normalizeArray(types);\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.push(...channelTypesValidator.parse(normalizedTypes));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets channel types for this select menu.\n\t *\n\t * @param types - The channel types to use\n\t */\n\tpublic setChannelTypes(...types: RestOrArray) {\n\t\tconst normalizedTypes = normalizeArray(types);\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.splice(0, this.data.channel_types.length, ...channelTypesValidator.parse(normalizedTypes));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default channels to this auto populated select menu.\n\t *\n\t * @param channels - The channels to add\n\t */\n\tpublic addDefaultChannels(...channels: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(channels);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Channel as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default channels for this auto populated select menu.\n\t *\n\t * @param channels - The channels to set\n\t */\n\tpublic setDefaultChannels(...channels: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(channels);\n\t\toptionsLengthValidator.parse(normalizedValues.length);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.Channel as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc BaseSelectMenuBuilder.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 { s } from '@sapphire/shapeshift';\nimport { ComponentType, TextInputStyle } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport { customIdValidator, idValidator } from '../Assertions.js';\n\nexport const textInputStyleValidator = s.nativeEnum(TextInputStyle).setValidationEnabled(isValidationEnabled);\nexport const minLengthValidator = s\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(4_000)\n\t.setValidationEnabled(isValidationEnabled);\nexport const maxLengthValidator = s\n\t.number()\n\t.int()\n\t.greaterThanOrEqual(1)\n\t.lessThanOrEqual(4_000)\n\t.setValidationEnabled(isValidationEnabled);\nexport const requiredValidator = s.boolean().setValidationEnabled(isValidationEnabled);\nexport const valueValidator = s.string().lengthLessThanOrEqual(4_000).setValidationEnabled(isValidationEnabled);\nexport const placeholderValidator = s.string().lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);\nexport const labelValidator = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(45)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const textInputPredicate = s\n\t.object({\n\t\ttype: s.literal(ComponentType.TextInput),\n\t\tcustom_id: customIdValidator,\n\t\tstyle: textInputStyleValidator,\n\t\tid: idValidator.optional(),\n\t\tmin_length: minLengthValidator.optional(),\n\t\tmax_length: maxLengthValidator.optional(),\n\t\tplaceholder: placeholderValidator.optional(),\n\t\tvalue: valueValidator.optional(),\n\t\trequired: requiredValidator.optional(),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredParameters(customId?: string, style?: TextInputStyle) {\n\tcustomIdValidator.parse(customId);\n\ttextInputStyleValidator.parse(style);\n}\n","import type { APISelectMenuComponent } from 'discord-api-types/v10';\nimport { customIdValidator, disabledValidator, minMaxValidator, placeholderValidator } from '../Assertions.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { requiredValidator } from '../textInput/Assertions.js';\n\n/**\n * The base select menu builder that contains common symbols for select menu builders.\n *\n * @typeParam SelectMenuType - The type of select menu this would be instantiated for.\n */\nexport abstract 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\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 can be selected in the select menu.\n\t *\n\t * @param maxValues - The maximum values that can 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\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\t/**\n\t * Sets whether this select menu is required.\n\t *\n\t * @remarks Only for use in modals.\n\t * @param required - Whether this select menu is required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = requiredValidator.parse(required);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): 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 {\n\ttype APIMentionableSelectComponent,\n\ttype APISelectMenuDefaultValue,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { optionsLengthValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for mentionable select menus.\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\t/**\n\t * Adds default roles to this auto populated select menu.\n\t *\n\t * @param roles - The roles to add\n\t */\n\tpublic addDefaultRoles(...roles: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default users to this auto populated select menu.\n\t *\n\t * @param users - The users to add\n\t */\n\tpublic addDefaultUsers(...users: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(users);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default values to this auto populated select menu.\n\t *\n\t * @param values - The values to add\n\t */\n\tpublic addDefaultValues(\n\t\t...values: RestOrArray<\n\t\t\t| APISelectMenuDefaultValue\n\t\t\t| APISelectMenuDefaultValue\n\t\t>\n\t) {\n\t\tconst normalizedValues = normalizeArray(values);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\t\tthis.data.default_values.push(...normalizedValues);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default values for this auto populated select menu.\n\t *\n\t * @param values - The values to set\n\t */\n\tpublic setDefaultValues(\n\t\t...values: RestOrArray<\n\t\t\t| APISelectMenuDefaultValue\n\t\t\t| APISelectMenuDefaultValue\n\t\t>\n\t) {\n\t\tconst normalizedValues = normalizeArray(values);\n\t\toptionsLengthValidator.parse(normalizedValues.length);\n\t\tthis.data.default_values = normalizedValues;\n\t\treturn this;\n\t}\n}\n","import {\n\ttype APIRoleSelectComponent,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { optionsLengthValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for role select menus.\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\t/**\n\t * Adds default roles to this auto populated select menu.\n\t *\n\t * @param roles - The roles to add\n\t */\n\tpublic addDefaultRoles(...roles: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default roles for this auto populated select menu.\n\t *\n\t * @param roles - The roles to set\n\t */\n\tpublic setDefaultRoles(...roles: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\t\toptionsLengthValidator.parse(normalizedValues.length);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n}\n","import { ComponentType } from 'discord-api-types/v10';\nimport type { APIStringSelectComponent, APISelectMenuOption } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { optionsLengthValidator, validateRequiredSelectMenuParameters } from '../Assertions.js';\nimport { selectMenuStringOptionPredicate } from './Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\nimport { StringSelectMenuOptionBuilder } from './StringSelectMenuOption.js';\n\n/**\n * A builder that creates API-compatible JSON data for string select menus.\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\n\t */\n\tpublic addOptions(...options: RestOrArray) {\n\t\tconst normalizedOptions = normalizeArray(options);\n\t\toptionsLengthValidator.parse(this.options.length + normalizedOptions.length);\n\t\tthis.options.push(\n\t\t\t...normalizedOptions.map((normalizedOption) =>\n\t\t\t\tnormalizedOption instanceof StringSelectMenuOptionBuilder\n\t\t\t\t\t? normalizedOption\n\t\t\t\t\t: new StringSelectMenuOptionBuilder(selectMenuStringOptionPredicate.parse(normalizedOption)),\n\t\t\t),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the options for this select menu.\n\t *\n\t * @param options - The options to set\n\t */\n\tpublic setOptions(...options: RestOrArray) {\n\t\treturn this.spliceOptions(0, this.options.length, ...options);\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts options for this select menu.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | Array.prototype.splice()}.\n\t * It's useful for modifying and adjusting the order of existing options.\n\t * @example\n\t * Remove the first option:\n\t * ```ts\n\t * selectMenu.spliceOptions(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n option:\n\t * ```ts\n\t * const n = 4;\n\t * selectMenu.spliceOptions(0, n);\n\t * ```\n\t * @example\n\t * Remove the last option:\n\t * ```ts\n\t * selectMenu.spliceOptions(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of options to remove\n\t * @param options - The replacing option objects or builders\n\t */\n\tpublic spliceOptions(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...options: RestOrArray\n\t) {\n\t\tconst normalizedOptions = normalizeArray(options);\n\n\t\tconst clone = [...this.options];\n\n\t\tclone.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...normalizedOptions.map((normalizedOption) =>\n\t\t\t\tnormalizedOption instanceof StringSelectMenuOptionBuilder\n\t\t\t\t\t? normalizedOption\n\t\t\t\t\t: new StringSelectMenuOptionBuilder(selectMenuStringOptionPredicate.parse(normalizedOption)),\n\t\t\t),\n\t\t);\n\n\t\toptionsLengthValidator.parse(clone.length);\n\t\tthis.options.splice(0, this.options.length, ...clone);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc BaseSelectMenuBuilder.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 { Result, s } from '@sapphire/shapeshift';\nimport { ChannelType, ComponentType, SelectMenuDefaultValueType } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport { customIdValidator, emojiValidator, idValidator } from '../Assertions.js';\n\nconst selectMenuBasePredicate = s.object({\n\tid: idValidator.optional(),\n\tplaceholder: s.string().lengthLessThanOrEqual(150).optional(),\n\tmin_values: s.number().greaterThanOrEqual(0).lessThanOrEqual(25).optional(),\n\tmax_values: s.number().greaterThanOrEqual(0).lessThanOrEqual(25).optional(),\n\tcustom_id: customIdValidator,\n\tdisabled: s.boolean().optional(),\n});\n\nexport const selectMenuChannelPredicate = selectMenuBasePredicate\n\t.extend({\n\t\ttype: s.literal(ComponentType.ChannelSelect),\n\t\tchannel_types: s.nativeEnum(ChannelType).array().optional(),\n\t\tdefault_values: s\n\t\t\t.object({ id: s.string(), type: s.literal(SelectMenuDefaultValueType.Channel) })\n\t\t\t.array()\n\t\t\t.lengthLessThanOrEqual(25)\n\t\t\t.optional(),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const selectMenuMentionablePredicate = selectMenuBasePredicate\n\t.extend({\n\t\ttype: s.literal(ComponentType.MentionableSelect),\n\t\tdefault_values: s\n\t\t\t.object({\n\t\t\t\tid: s.string(),\n\t\t\t\ttype: s.union([s.literal(SelectMenuDefaultValueType.Role), s.literal(SelectMenuDefaultValueType.User)]),\n\t\t\t})\n\t\t\t.array()\n\t\t\t.lengthLessThanOrEqual(25)\n\t\t\t.optional(),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const selectMenuRolePredicate = selectMenuBasePredicate\n\t.extend({\n\t\ttype: s.literal(ComponentType.RoleSelect),\n\t\tdefault_values: s\n\t\t\t.object({ id: s.string(), type: s.literal(SelectMenuDefaultValueType.Role) })\n\t\t\t.array()\n\t\t\t.lengthLessThanOrEqual(25)\n\t\t\t.optional(),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const selectMenuUserPredicate = selectMenuBasePredicate\n\t.extend({\n\t\ttype: s.literal(ComponentType.UserSelect),\n\t\tdefault_values: s\n\t\t\t.object({ id: s.string(), type: s.literal(SelectMenuDefaultValueType.User) })\n\t\t\t.array()\n\t\t\t.lengthLessThanOrEqual(25)\n\t\t\t.optional(),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const selectMenuStringOptionPredicate = s\n\t.object({\n\t\tlabel: s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100),\n\t\tvalue: s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100),\n\t\tdescription: s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).optional(),\n\t\temoji: emojiValidator.optional(),\n\t\tdefault: s.boolean().optional(),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const selectMenuStringPredicate = selectMenuBasePredicate\n\t.extend({\n\t\ttype: s.literal(ComponentType.StringSelect),\n\t\toptions: selectMenuStringOptionPredicate.array().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(25),\n\t})\n\t.reshape((value) => {\n\t\tif (value.min_values !== undefined && value.options.length < value.min_values) {\n\t\t\treturn Result.err(new RangeError(`The number of options must be greater than or equal to min_values`));\n\t\t}\n\n\t\tif (value.min_values !== undefined && value.max_values !== undefined && value.min_values > value.max_values) {\n\t\t\treturn Result.err(\n\t\t\t\tnew RangeError(`The maximum amount of options must be greater than or equal to the minimum amount of options`),\n\t\t\t);\n\t\t}\n\n\t\treturn Result.ok(value);\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n","import {\n\ttype APIUserSelectComponent,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { optionsLengthValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for user select menus.\n */\nexport class UserSelectMenuBuilder extends BaseSelectMenuBuilder {\n\t/**\n\t * Creates a new select menu from API data.\n\t *\n\t * @param data - The API data to create this select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new UserSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new UserSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1);\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ ...data, type: ComponentType.UserSelect });\n\t}\n\n\t/**\n\t * Adds default users to this auto populated select menu.\n\t *\n\t * @param users - The users to add\n\t */\n\tpublic addDefaultUsers(...users: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(users);\n\t\toptionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default users for this auto populated select menu.\n\t *\n\t * @param users - The users to set\n\t */\n\tpublic setDefaultUsers(...users: RestOrArray) {\n\t\tconst normalizedValues = normalizeArray(users);\n\t\toptionsLengthValidator.parse(normalizedValues.length);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n}\n","import { isJSONEncodable, type Equatable, type JSONEncodable } from '@discordjs/util';\nimport { ComponentType, type TextInputStyle, type APITextInputComponent } from 'discord-api-types/v10';\nimport isEqual from 'fast-deep-equal';\nimport { customIdValidator } from '../Assertions.js';\nimport { ComponentBuilder } from '../Component.js';\nimport {\n\tmaxLengthValidator,\n\tminLengthValidator,\n\tplaceholderValidator,\n\trequiredValidator,\n\tvalueValidator,\n\tvalidateRequiredParameters,\n\tlabelValidator,\n\ttextInputStyleValidator,\n} from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for text inputs.\n */\nexport class TextInputBuilder\n\textends ComponentBuilder\n\timplements Equatable>\n{\n\t/**\n\t * Creates a new text input from API data.\n\t *\n\t * @param data - The API data to create this text input with\n\t * @example\n\t * Creating a text input from an API data object:\n\t * ```ts\n\t * const textInput = new TextInputBuilder({\n\t * \tcustom_id: 'a cool text input',\n\t * \tplaceholder: 'Type something',\n\t * \tstyle: TextInputStyle.Short,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a text input using setters and API data:\n\t * ```ts\n\t * const textInput = new TextInputBuilder({\n\t * \tplaceholder: 'Type something else',\n\t * })\n\t * \t.setCustomId('woah')\n\t * \t.setStyle(TextInputStyle.Paragraph);\n\t * ```\n\t */\n\tpublic constructor(data?: APITextInputComponent & { type?: ComponentType.TextInput }) {\n\t\tsuper({ type: ComponentType.TextInput, ...data });\n\t}\n\n\t/**\n\t * Sets the custom id for this text input.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the label for this text input.\n\t *\n\t * @param label - The label to use\n\t * @deprecated Use a label builder to create a label (and optionally a description) instead.\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = labelValidator.parse(label);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the style for this text input.\n\t *\n\t * @param style - The style to use\n\t */\n\tpublic setStyle(style: TextInputStyle) {\n\t\tthis.data.style = textInputStyleValidator.parse(style);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum length of text for this text input.\n\t *\n\t * @param minLength - The minimum length of text for this text input\n\t */\n\tpublic setMinLength(minLength: number) {\n\t\tthis.data.min_length = minLengthValidator.parse(minLength);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum length of text for this text input.\n\t *\n\t * @param maxLength - The maximum length of text for this text input\n\t */\n\tpublic setMaxLength(maxLength: number) {\n\t\tthis.data.max_length = maxLengthValidator.parse(maxLength);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the placeholder for this text input.\n\t *\n\t * @param placeholder - The placeholder to use\n\t */\n\tpublic setPlaceholder(placeholder: string) {\n\t\tthis.data.placeholder = placeholderValidator.parse(placeholder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value for this text input.\n\t *\n\t * @param value - The value to use\n\t */\n\tpublic setValue(value: string) {\n\t\tthis.data.value = valueValidator.parse(value);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this text input is required.\n\t *\n\t * @param required - Whether this text input is required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = requiredValidator.parse(required);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APITextInputComponent {\n\t\tvalidateRequiredParameters(this.data.custom_id, this.data.style);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as APITextInputComponent;\n\t}\n\n\t/**\n\t * Whether this is equal to another structure.\n\t */\n\tpublic equals(other: APITextInputComponent | JSONEncodable): boolean {\n\t\tif (isJSONEncodable(other)) {\n\t\t\treturn isEqual(other.toJSON(), this.data);\n\t\t}\n\n\t\treturn isEqual(other, this.data);\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport { idValidator } from '../Assertions.js';\nimport { fileUploadPredicate } from '../fileUpload/Assertions.js';\nimport {\n\tselectMenuChannelPredicate,\n\tselectMenuMentionablePredicate,\n\tselectMenuRolePredicate,\n\tselectMenuStringPredicate,\n\tselectMenuUserPredicate,\n} from '../selectMenu/Assertions.js';\nimport { textInputPredicate } from '../textInput/Assertions.js';\n\nexport const labelPredicate = s\n\t.object({\n\t\tid: idValidator.optional(),\n\t\ttype: s.literal(ComponentType.Label),\n\t\tlabel: s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45),\n\t\tdescription: s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).optional(),\n\t\tcomponent: s.union([\n\t\t\ttextInputPredicate,\n\t\t\tselectMenuUserPredicate,\n\t\t\tselectMenuRolePredicate,\n\t\t\tselectMenuMentionablePredicate,\n\t\t\tselectMenuChannelPredicate,\n\t\t\tselectMenuStringPredicate,\n\t\t\tfileUploadPredicate,\n\t\t]),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n","/* eslint-disable jsdoc/check-param-names */\n\nimport type {\n\tAPIActionRowComponent,\n\tAPIComponentInContainer,\n\tAPIComponentInMessageActionRow,\n\tAPIContainerComponent,\n\tAPIFileComponent,\n\tAPIMediaGalleryComponent,\n\tAPISectionComponent,\n\tAPISeparatorComponent,\n\tAPITextDisplayComponent,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport type { RGBTuple } from '../../index.js';\nimport { MediaGalleryBuilder, SectionBuilder } from '../../index.js';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport type { AnyComponentBuilder, MessageActionRowComponentBuilder } from '../ActionRow.js';\nimport { ActionRowBuilder } from '../ActionRow.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { createComponentBuilder, resolveBuilder } from '../Components.js';\nimport { containerColorPredicate, spoilerPredicate } from './Assertions.js';\nimport { FileBuilder } from './File.js';\nimport { SeparatorBuilder } from './Separator.js';\nimport { TextDisplayBuilder } from './TextDisplay.js';\n\n/**\n * The builders that may be used within a container.\n */\nexport type ContainerComponentBuilder =\n\t| ActionRowBuilder\n\t| FileBuilder\n\t| MediaGalleryBuilder\n\t| SectionBuilder\n\t| SeparatorBuilder\n\t| TextDisplayBuilder;\n\n/**\n * A builder that creates API-compatible JSON data for a container.\n */\nexport class ContainerBuilder extends ComponentBuilder {\n\t/**\n\t * The components within this container.\n\t */\n\tpublic readonly components: ContainerComponentBuilder[];\n\n\t/**\n\t * Creates a new container from API data.\n\t *\n\t * @param data - The API data to create this container with\n\t * @example\n\t * Creating a container from an API data object:\n\t * ```ts\n\t * const container = new ContainerBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"Some text here\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating a container using setters and API data:\n\t * ```ts\n\t * const container = new ContainerBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"# Heading\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * })\n\t * .addSeparatorComponents(separator)\n\t * .addSectionComponents(section);\n\t * ```\n\t */\n\tpublic constructor({ components, ...data }: Partial = {}) {\n\t\tsuper({ type: ComponentType.Container, ...data });\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ??\n\t\t\t[]) as ContainerComponentBuilder[];\n\t}\n\n\t/**\n\t * Sets the accent color of this container.\n\t *\n\t * @param color - The color to use\n\t */\n\tpublic setAccentColor(color?: RGBTuple | number): this {\n\t\t// Data assertions\n\t\tcontainerColorPredicate.parse(color);\n\n\t\tif (Array.isArray(color)) {\n\t\t\tconst [red, green, blue] = color;\n\t\t\tthis.data.accent_color = (red << 16) + (green << 8) + blue;\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.data.accent_color = color;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the accent color of this container.\n\t */\n\tpublic clearAccentColor() {\n\t\tthis.data.accent_color = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds action row components to this container.\n\t *\n\t * @param components - The action row components to add\n\t */\n\tpublic addActionRowComponents(\n\t\t...components: RestOrArray<\n\t\t\t| ActionRowBuilder\n\t\t\t| APIActionRowComponent\n\t\t\t| ((builder: ActionRowBuilder) => ActionRowBuilder)\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component) => resolveBuilder(component, ActionRowBuilder)),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds file components to this container.\n\t *\n\t * @param components - The file components to add\n\t */\n\tpublic addFileComponents(\n\t\t...components: RestOrArray FileBuilder)>\n\t) {\n\t\tthis.components.push(...normalizeArray(components).map((component) => resolveBuilder(component, FileBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds media gallery components to this container.\n\t *\n\t * @param components - The media gallery components to add\n\t */\n\tpublic addMediaGalleryComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPIMediaGalleryComponent | MediaGalleryBuilder | ((builder: MediaGalleryBuilder) => MediaGalleryBuilder)\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component) => resolveBuilder(component, MediaGalleryBuilder)),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds section components to this container.\n\t *\n\t * @param components - The section components to add\n\t */\n\tpublic addSectionComponents(\n\t\t...components: RestOrArray SectionBuilder)>\n\t) {\n\t\tthis.components.push(...normalizeArray(components).map((component) => resolveBuilder(component, SectionBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds separator components to this container.\n\t *\n\t * @param components - The separator components to add\n\t */\n\tpublic addSeparatorComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPISeparatorComponent | SeparatorBuilder | ((builder: SeparatorBuilder) => SeparatorBuilder)\n\t\t>\n\t) {\n\t\tthis.components.push(...normalizeArray(components).map((component) => resolveBuilder(component, SeparatorBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds text display components to this container.\n\t *\n\t * @param components - The text display components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component) => resolveBuilder(component, TextDisplayBuilder)),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts components for this container.\n\t *\n\t * @param index - The index to start removing, replacing or inserting components\n\t * @param deleteCount - The amount of components to remove\n\t * @param components - The components to set\n\t */\n\tpublic spliceComponents(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...components: RestOrArray\n\t) {\n\t\tthis.components.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...normalizeArray(components).map((component) =>\n\t\t\t\tcomponent instanceof ComponentBuilder ? component : createComponentBuilder(component),\n\t\t\t),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this container.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoilerPredicate.parse(spoiler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIContainerComponent {\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t} as APIContainerComponent;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { SeparatorSpacingSize } from 'discord-api-types/v10';\nimport { colorPredicate } from '../../messages/embed/Assertions';\nimport { isValidationEnabled } from '../../util/validation';\nimport { ComponentBuilder } from '../Component';\nimport { ButtonBuilder } from '../button/Button';\nimport type { ContainerComponentBuilder } from './Container';\nimport type { MediaGalleryItemBuilder } from './MediaGalleryItem';\nimport type { TextDisplayBuilder } from './TextDisplay';\nimport { ThumbnailBuilder } from './Thumbnail';\n\nexport const unfurledMediaItemPredicate = s\n\t.object({\n\t\turl: s\n\t\t\t.string()\n\t\t\t.url(\n\t\t\t\t{ allowedProtocols: ['http:', 'https:', 'attachment:'] },\n\t\t\t\t{ message: 'Invalid protocol for media URL. Must be http:, https:, or attachment:' },\n\t\t\t),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const descriptionPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(1_024)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const filePredicate = s\n\t.object({\n\t\turl: s\n\t\t\t.string()\n\t\t\t.url({ allowedProtocols: ['attachment:'] }, { message: 'Invalid protocol for file URL. Must be attachment:' }),\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const spoilerPredicate = s.boolean();\n\nexport const dividerPredicate = s.boolean();\n\nexport const spacingPredicate = s.nativeEnum(SeparatorSpacingSize);\n\nexport const textDisplayContentPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(4_000)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const accessoryPredicate = s\n\t.instance(ButtonBuilder)\n\t.or(s.instance(ThumbnailBuilder))\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const containerColorPredicate = colorPredicate.nullish();\n\nexport function assertReturnOfBuilder(\n\tinput: unknown,\n\tExpectedInstanceOf: new () => ReturnType,\n): asserts input is ReturnType {\n\ts.instance(ExpectedInstanceOf).setValidationEnabled(isValidationEnabled).parse(input);\n}\n\nexport function validateComponentArray<\n\tReturnType extends ContainerComponentBuilder | MediaGalleryItemBuilder = ContainerComponentBuilder,\n>(input: unknown, min: number, max: number, ExpectedInstanceOf?: new () => ReturnType): asserts input is ReturnType[] {\n\t(ExpectedInstanceOf ? s.instance(ExpectedInstanceOf) : s.instance(ComponentBuilder))\n\t\t.array()\n\t\t.lengthGreaterThanOrEqual(min)\n\t\t.lengthLessThanOrEqual(max)\n\t\t.setValidationEnabled(isValidationEnabled)\n\t\t.parse(input);\n}\n","import type { APIThumbnailComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component';\nimport { descriptionPredicate, spoilerPredicate, unfurledMediaItemPredicate } from './Assertions';\n\nexport class ThumbnailBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new thumbnail from API data.\n\t *\n\t * @param data - The API data to create this thumbnail with\n\t * @example\n\t * Creating a thumbnail from an API data object:\n\t * ```ts\n\t * const thumbnail = new ThumbnailBuilder({\n\t * \tdescription: 'some text',\n\t * media: {\n\t * url: 'https://cdn.discordapp.com/embed/avatars/4.png',\n\t * },\n\t * });\n\t * ```\n\t * @example\n\t * Creating a thumbnail using setters and API data:\n\t * ```ts\n\t * const thumbnail = new ThumbnailBuilder({\n\t * \tmedia: {\n\t * url: 'attachment://image.png',\n\t * },\n\t * })\n\t * \t.setDescription('alt text');\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({\n\t\t\ttype: ComponentType.Thumbnail,\n\t\t\t...data,\n\t\t\tmedia: data.media ? { url: data.media.url } : undefined,\n\t\t});\n\t}\n\n\t/**\n\t * Sets the description of this thumbnail.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = descriptionPredicate.parse(description);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description of this thumbnail.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this thumbnail.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoilerPredicate.parse(spoiler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the media URL of this thumbnail.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.media = unfurledMediaItemPredicate.parse({ url });\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritdoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APIThumbnailComponent {\n\t\tunfurledMediaItemPredicate.parse(this.data.media);\n\n\t\treturn { ...this.data } as APIThumbnailComponent;\n\t}\n}\n","import { ComponentType, type APIFileComponent } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component';\nimport { filePredicate, spoilerPredicate } from './Assertions';\n\nexport class FileBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new file from API data.\n\t *\n\t * @param data - The API data to create this file with\n\t * @example\n\t * Creating a file from an API data object:\n\t * ```ts\n\t * const file = new FileBuilder({\n\t * \tspoiler: true,\n\t * \tfile: {\n\t * \t\turl: 'attachment://file.png',\n\t * \t},\n\t * });\n\t * ```\n\t * @example\n\t * Creating a file using setters and API data:\n\t * ```ts\n\t * const file = new FileBuilder({\n\t * \tfile: {\n\t * \t\turl: 'attachment://image.jpg',\n\t * \t},\n\t * })\n\t * \t.setSpoiler(false);\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({ type: ComponentType.File, ...data, file: data.file ? { url: data.file.url } : undefined });\n\t}\n\n\t/**\n\t * Sets the spoiler status of this file.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoilerPredicate.parse(spoiler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the media URL of this file.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.file = filePredicate.parse({ url });\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APIFileComponent {\n\t\tfilePredicate.parse(this.data.file);\n\n\t\treturn { ...this.data, file: { ...this.data.file } } as APIFileComponent;\n\t}\n}\n","import type { SeparatorSpacingSize, APISeparatorComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component';\nimport { dividerPredicate, spacingPredicate } from './Assertions';\n\nexport class SeparatorBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new separator from API data.\n\t *\n\t * @param data - The API data to create this separator with\n\t * @example\n\t * Creating a separator from an API data object:\n\t * ```ts\n\t * const separator = new SeparatorBuilder({\n\t * \tspacing: SeparatorSpacingSize.Small,\n\t * divider: true,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a separator using setters and API data:\n\t * ```ts\n\t * const separator = new SeparatorBuilder({\n\t * \tspacing: SeparatorSpacingSize.Large,\n\t * })\n\t * \t.setDivider(false);\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({\n\t\t\ttype: ComponentType.Separator,\n\t\t\t...data,\n\t\t});\n\t}\n\n\t/**\n\t * Sets whether this separator should show a divider line.\n\t *\n\t * @param divider - Whether to show a divider line\n\t */\n\tpublic setDivider(divider = true) {\n\t\tthis.data.divider = dividerPredicate.parse(divider);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spacing of this separator.\n\t *\n\t * @param spacing - The spacing to use\n\t */\n\tpublic setSpacing(spacing: SeparatorSpacingSize) {\n\t\tthis.data.spacing = spacingPredicate.parse(spacing);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the spacing of this separator.\n\t */\n\tpublic clearSpacing() {\n\t\tthis.data.spacing = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APISeparatorComponent {\n\t\treturn { ...this.data } as APISeparatorComponent;\n\t}\n}\n","import type { APITextDisplayComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component';\nimport { textDisplayContentPredicate } from './Assertions';\n\nexport class TextDisplayBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new text display from API data.\n\t *\n\t * @param data - The API data to create this text display with\n\t * @example\n\t * Creating a text display from an API data object:\n\t * ```ts\n\t * const textDisplay = new TextDisplayBuilder({\n\t * \tcontent: 'some text',\n\t * });\n\t * ```\n\t * @example\n\t * Creating a text display using setters and API data:\n\t * ```ts\n\t * const textDisplay = new TextDisplayBuilder({\n\t * \tcontent: 'old text',\n\t * })\n\t * \t.setContent('new text');\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tsuper({\n\t\t\ttype: ComponentType.TextDisplay,\n\t\t\t...data,\n\t\t});\n\t}\n\n\t/**\n\t * Sets the text of this text display.\n\t *\n\t * @param content - The text to use\n\t */\n\tpublic setContent(content: string) {\n\t\tthis.data.content = textDisplayContentPredicate.parse(content);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APITextDisplayComponent {\n\t\ttextDisplayContentPredicate.parse(this.data.content);\n\n\t\treturn { ...this.data } as APITextDisplayComponent;\n\t}\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport type { APIMediaGalleryComponent, APIMediaGalleryItem } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { resolveBuilder } from '../Components.js';\nimport { assertReturnOfBuilder, validateComponentArray } from './Assertions.js';\nimport { MediaGalleryItemBuilder } from './MediaGalleryItem.js';\n\n/**\n * A builder that creates API-compatible JSON data for a container.\n */\nexport class MediaGalleryBuilder extends ComponentBuilder {\n\t/**\n\t * The components within this container.\n\t */\n\tpublic readonly items: MediaGalleryItemBuilder[];\n\n\t/**\n\t * Creates a new media gallery from API data.\n\t *\n\t * @param data - The API data to create this media gallery with\n\t * @example\n\t * Creating a media gallery from an API data object:\n\t * ```ts\n\t * const mediaGallery = new MediaGalleryBuilder({\n\t * \titems: [\n\t * \t\t{\n\t * \t\t\tdescription: \"Some text here\",\n\t * \t\t\tmedia: {\n\t * \t\t\t\turl: 'https://cdn.discordapp.com/embed/avatars/2.png',\n\t * \t\t\t},\n\t * \t\t},\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating a media gallery using setters and API data:\n\t * ```ts\n\t * const mediaGallery = new MediaGalleryBuilder({\n\t * \titems: [\n\t * \t\t{\n\t * \t\t\tdescription: \"alt text\",\n\t * \t\t\tmedia: {\n\t * \t\t\t\turl: 'https://cdn.discordapp.com/embed/avatars/5.png',\n\t * \t\t\t},\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.addItems(item2, item3);\n\t * ```\n\t */\n\tpublic constructor({ items, ...data }: Partial = {}) {\n\t\tsuper({ type: ComponentType.MediaGallery, ...data });\n\t\tthis.items = items?.map((item) => new MediaGalleryItemBuilder(item)) ?? [];\n\t}\n\n\t/**\n\t * Adds items to this media gallery.\n\t *\n\t * @param items - The items to add\n\t */\n\tpublic addItems(\n\t\t...items: RestOrArray<\n\t\t\tAPIMediaGalleryItem | MediaGalleryItemBuilder | ((builder: MediaGalleryItemBuilder) => MediaGalleryItemBuilder)\n\t\t>\n\t) {\n\t\tthis.items.push(\n\t\t\t...normalizeArray(items).map((input) => {\n\t\t\t\tconst result = resolveBuilder(input, MediaGalleryItemBuilder);\n\n\t\t\t\tassertReturnOfBuilder(result, MediaGalleryItemBuilder);\n\t\t\t\treturn result;\n\t\t\t}),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts media gallery items for this media gallery.\n\t *\n\t * @param index - The index to start removing, replacing or inserting items\n\t * @param deleteCount - The amount of items to remove\n\t * @param items - The items to insert\n\t */\n\tpublic spliceItems(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...items: RestOrArray<\n\t\t\tAPIMediaGalleryItem | MediaGalleryItemBuilder | ((builder: MediaGalleryItemBuilder) => MediaGalleryItemBuilder)\n\t\t>\n\t) {\n\t\tthis.items.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...normalizeArray(items).map((input) => {\n\t\t\t\tconst result = resolveBuilder(input, MediaGalleryItemBuilder);\n\n\t\t\t\tassertReturnOfBuilder(result, MediaGalleryItemBuilder);\n\t\t\t\treturn result;\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 toJSON(): APIMediaGalleryComponent {\n\t\tvalidateComponentArray(this.items, 1, 10, MediaGalleryItemBuilder);\n\t\treturn {\n\t\t\t...this.data,\n\t\t\titems: this.items.map((item) => item.toJSON()),\n\t\t} as APIMediaGalleryComponent;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIMediaGalleryItem } from 'discord-api-types/v10';\nimport { descriptionPredicate, spoilerPredicate, unfurledMediaItemPredicate } from './Assertions';\n\nexport class MediaGalleryItemBuilder implements JSONEncodable {\n\t/**\n\t * The API data associated with this media gallery item.\n\t */\n\tpublic readonly data: Partial;\n\n\t/**\n\t * Creates a new media gallery item from API data.\n\t *\n\t * @param data - The API data to create this media gallery item with\n\t * @example\n\t * Creating a media gallery item from an API data object:\n\t * ```ts\n\t * const item = new MediaGalleryItemBuilder({\n\t * \tdescription: \"Some text here\",\n\t * \tmedia: {\n\t * \t\turl: 'https://cdn.discordapp.com/embed/avatars/2.png',\n\t * \t},\n\t * });\n\t * ```\n\t * @example\n\t * Creating a media gallery item using setters and API data:\n\t * ```ts\n\t * const item = new MediaGalleryItemBuilder({\n\t * \tmedia: {\n\t * \t\turl: 'https://cdn.discordapp.com/embed/avatars/5.png',\n\t * \t},\n\t * })\n\t * \t.setDescription(\"alt text\");\n\t * ```\n\t */\n\tpublic constructor(data: Partial = {}) {\n\t\tthis.data = data;\n\t}\n\n\t/**\n\t * Sets the description of this media gallery item.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = descriptionPredicate.parse(description);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description of this media gallery item.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this media gallery item.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoilerPredicate.parse(spoiler);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the media URL of this media gallery item.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.media = unfurledMediaItemPredicate.parse({ url });\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIMediaGalleryItem {\n\t\tunfurledMediaItemPredicate.parse(this.data.media);\n\n\t\treturn { ...this.data } as APIMediaGalleryItem;\n\t}\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport type {\n\tAPIButtonComponent,\n\tAPISectionComponent,\n\tAPITextDisplayComponent,\n\tAPIThumbnailComponent,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ButtonBuilder, ThumbnailBuilder } from '../../index.js';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { createComponentBuilder, resolveBuilder } from '../Components.js';\nimport { accessoryPredicate, assertReturnOfBuilder, validateComponentArray } from './Assertions.js';\nimport { TextDisplayBuilder } from './TextDisplay.js';\n\n/**\n * A builder that creates API-compatible JSON data for a section.\n */\nexport class SectionBuilder extends ComponentBuilder {\n\t/**\n\t * The components within this section.\n\t */\n\tpublic readonly components: ComponentBuilder[];\n\n\t/**\n\t * The accessory of this section.\n\t */\n\tpublic readonly accessory?: ButtonBuilder | ThumbnailBuilder;\n\n\t/**\n\t * Creates a new section from API data.\n\t *\n\t * @param data - The API data to create this section with\n\t * @example\n\t * Creating a section from an API data object:\n\t * ```ts\n\t * const section = new SectionBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"Some text here\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * accessory: {\n\t * media: {\n\t * url: 'https://cdn.discordapp.com/embed/avatars/3.png',\n\t * },\n\t * }\n\t * });\n\t * ```\n\t * @example\n\t * Creating a section using setters and API data:\n\t * ```ts\n\t * const section = new SectionBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"# Heading\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.setPrimaryButtonAccessory(button);\n\t * ```\n\t */\n\tpublic constructor({ components, accessory, ...data }: Partial = {}) {\n\t\tsuper({ type: ComponentType.Section, ...data });\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ?? []) as ComponentBuilder[];\n\t\tthis.accessory = accessory ? createComponentBuilder(accessory) : undefined;\n\t}\n\n\t/**\n\t * Sets the accessory of this section to a button.\n\t *\n\t * @param accessory - The accessory to use\n\t */\n\tpublic setButtonAccessory(\n\t\taccessory: APIButtonComponent | ButtonBuilder | ((builder: ButtonBuilder) => ButtonBuilder),\n\t): this {\n\t\tReflect.set(this, 'accessory', accessoryPredicate.parse(resolveBuilder(accessory, ButtonBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the accessory of this section to a thumbnail.\n\t *\n\t * @param accessory - The accessory to use\n\t */\n\tpublic setThumbnailAccessory(\n\t\taccessory: APIThumbnailComponent | ThumbnailBuilder | ((builder: ThumbnailBuilder) => ThumbnailBuilder),\n\t): this {\n\t\tReflect.set(this, 'accessory', accessoryPredicate.parse(resolveBuilder(accessory, ThumbnailBuilder)));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds text display components to this section.\n\t *\n\t * @param components - The text display components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...components: RestOrArray TextDisplayBuilder)>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((input) => {\n\t\t\t\tconst result = resolveBuilder(input, TextDisplayBuilder);\n\n\t\t\t\tassertReturnOfBuilder(result, TextDisplayBuilder);\n\t\t\t\treturn result;\n\t\t\t}),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts text display components for this section.\n\t *\n\t * @param index - The index to start removing, replacing or inserting text display components\n\t * @param deleteCount - The amount of text display components to remove\n\t * @param components - The text display components to insert\n\t */\n\tpublic spliceTextDisplayComponents(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...components: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t) {\n\t\tthis.components.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...normalizeArray(components).map((input) => {\n\t\t\t\tconst result = resolveBuilder(input, TextDisplayBuilder);\n\n\t\t\t\tassertReturnOfBuilder(result, TextDisplayBuilder);\n\t\t\t\treturn result;\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 toJSON(): APISectionComponent {\n\t\tvalidateComponentArray(this.components, 1, 3, TextDisplayBuilder);\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t\taccessory: accessoryPredicate.parse(this.accessory).toJSON(),\n\t\t} as APISectionComponent;\n\t}\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tAPITextInputComponent,\n\tAPIActionRowComponent,\n\tAPIComponentInModalActionRow,\n\tAPILabelComponent,\n\tAPIModalInteractionResponseCallbackData,\n\tAPITextDisplayComponent,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../components/ActionRow.js';\nimport { customIdValidator } from '../../components/Assertions.js';\nimport { createComponentBuilder, resolveBuilder } from '../../components/Components.js';\nimport { LabelBuilder } from '../../components/label/Label.js';\nimport { TextInputBuilder } from '../../components/textInput/TextInput.js';\nimport { TextDisplayBuilder } from '../../components/v2/TextDisplay.js';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { titleValidator, validateRequiredParameters } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for modals.\n */\nexport class ModalBuilder implements JSONEncodable {\n\t/**\n\t * The API data associated with this modal.\n\t */\n\tpublic readonly data: Partial;\n\n\t/**\n\t * The components within this modal.\n\t */\n\tpublic readonly components: (ActionRowBuilder | LabelBuilder | TextDisplayBuilder)[] =\n\t\t[];\n\n\t/**\n\t * Creates a new modal from API data.\n\t *\n\t * @param data - The API data to create this modal with\n\t */\n\tpublic constructor({ components, ...data }: Partial = {}) {\n\t\tthis.data = { ...data };\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ?? []) as (\n\t\t\t| ActionRowBuilder\n\t\t\t| LabelBuilder\n\t\t)[];\n\t}\n\n\t/**\n\t * Sets the title of this modal.\n\t *\n\t * @param title - The title to use\n\t */\n\tpublic setTitle(title: string) {\n\t\tthis.data.title = titleValidator.parse(title);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom id of this modal.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds components to this modal.\n\t *\n\t * @param components - The components to add\n\t * @deprecated Use {@link ModalBuilder.addLabelComponents} or {@link ModalBuilder.addTextDisplayComponents} instead\n\t */\n\tpublic addComponents(\n\t\t...components: RestOrArray<\n\t\t\t| ActionRowBuilder\n\t\t\t| APIActionRowComponent\n\t\t\t| APILabelComponent\n\t\t\t| APITextDisplayComponent\n\t\t\t| APITextInputComponent\n\t\t\t| LabelBuilder\n\t\t\t| TextDisplayBuilder\n\t\t\t| TextInputBuilder\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component, idx) => {\n\t\t\t\tif (\n\t\t\t\t\tcomponent instanceof ActionRowBuilder ||\n\t\t\t\t\tcomponent instanceof LabelBuilder ||\n\t\t\t\t\tcomponent instanceof TextDisplayBuilder\n\t\t\t\t) {\n\t\t\t\t\treturn component;\n\t\t\t\t}\n\n\t\t\t\t// Deprecated support\n\t\t\t\tif (component instanceof TextInputBuilder) {\n\t\t\t\t\treturn new ActionRowBuilder().addComponents(component);\n\t\t\t\t}\n\n\t\t\t\tif ('type' in component) {\n\t\t\t\t\tif (component.type === ComponentType.ActionRow) {\n\t\t\t\t\t\treturn new ActionRowBuilder(component);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (component.type === ComponentType.Label) {\n\t\t\t\t\t\treturn new LabelBuilder(component);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (component.type === ComponentType.TextDisplay) {\n\t\t\t\t\t\treturn new TextDisplayBuilder(component);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Deprecated, should go in a label component\n\t\t\t\t\tif (component.type === ComponentType.TextInput) {\n\t\t\t\t\t\treturn new ActionRowBuilder().addComponents(\n\t\t\t\t\t\t\tnew TextInputBuilder(component),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthrow new TypeError(`Invalid component passed in ModalBuilder.addComponents at index ${idx}!`);\n\t\t\t}),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds label components to this modal.\n\t *\n\t * @param components - The components to add\n\t */\n\tpublic addLabelComponents(\n\t\t...components: RestOrArray LabelBuilder)>\n\t) {\n\t\tconst normalized = normalizeArray(components);\n\t\tconst resolved = normalized.map((label) => resolveBuilder(label, LabelBuilder));\n\n\t\tthis.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds text display components to this modal.\n\t *\n\t * @param components - The components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t) {\n\t\tconst normalized = normalizeArray(components);\n\t\tconst resolved = normalized.map((row) => resolveBuilder(row, TextDisplayBuilder));\n\n\t\tthis.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds action rows to this modal.\n\t *\n\t * @param components - The components to add\n\t * @deprecated Use {@link ModalBuilder.addLabelComponents} instead\n\t */\n\tpublic addActionRowComponents(\n\t\t...components: RestOrArray<\n\t\t\t| ActionRowBuilder\n\t\t\t| APIActionRowComponent\n\t\t\t| ((\n\t\t\t\t\tbuilder: ActionRowBuilder,\n\t\t\t ) => ActionRowBuilder)\n\t\t>\n\t) {\n\t\tconst normalized = normalizeArray(components);\n\t\tconst resolved = normalized.map((row) => resolveBuilder(row, ActionRowBuilder));\n\n\t\tthis.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the labels for this modal.\n\t *\n\t * @param components - The components to set\n\t */\n\tpublic setLabelComponents(\n\t\t...components: RestOrArray LabelBuilder)>\n\t) {\n\t\tconst normalized = normalizeArray(components);\n\t\tthis.spliceLabelComponents(0, this.components.length, ...normalized);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts labels for this modal.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t * The maximum amount of labels that can be added is 5.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing labels of a modal.\n\t * @example\n\t * Remove the first label:\n\t * ```ts\n\t * modal.spliceLabelComponents(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n labels:\n\t * ```ts\n\t * const n = 4;\n\t * modal.spliceLabelComponents(0, n);\n\t * ```\n\t * @example\n\t * Remove the last label:\n\t * ```ts\n\t * modal.spliceLabelComponents(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of labels to remove\n\t * @param labels - The replacing label objects\n\t */\n\tpublic spliceLabelComponents(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...labels: (APILabelComponent | LabelBuilder | ((builder: LabelBuilder) => LabelBuilder))[]\n\t): this {\n\t\tconst resolved = labels.map((label) => resolveBuilder(label, LabelBuilder));\n\t\tthis.components.splice(index, deleteCount, ...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets components for this modal.\n\t *\n\t * @param components - The components to set\n\t * @deprecated Use {@link ModalBuilder.setLabelComponents} instead\n\t */\n\tpublic setComponents(\n\t\t...components: RestOrArray | LabelBuilder | TextDisplayBuilder>\n\t) {\n\t\tthis.components.splice(0, this.components.length, ...normalizeArray(components));\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIModalInteractionResponseCallbackData {\n\t\tvalidateRequiredParameters(this.data.custom_id, this.data.title, this.components);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t} as APIModalInteractionResponseCallbackData;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../components/ActionRow.js';\nimport { customIdValidator } from '../../components/Assertions.js';\nimport { LabelBuilder } from '../../components/label/Label.js';\nimport { TextDisplayBuilder } from '../../components/v2/TextDisplay.js';\nimport { isValidationEnabled } from '../../util/validation.js';\n\nexport const titleValidator = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(45)\n\t.setValidationEnabled(isValidationEnabled);\nexport const componentsValidator = s\n\t.union([s.instance(ActionRowBuilder), s.instance(LabelBuilder), s.instance(TextDisplayBuilder)])\n\t.array()\n\t.lengthGreaterThanOrEqual(1)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredParameters(\n\tcustomId?: string,\n\ttitle?: string,\n\tcomponents?: (ActionRowBuilder | LabelBuilder | TextDisplayBuilder)[],\n) {\n\tcustomIdValidator.parse(customId);\n\ttitleValidator.parse(title);\n\tcomponentsValidator.parse(components);\n}\n","import { s } from '@sapphire/shapeshift';\nimport {\n\tApplicationIntegrationType,\n\tInteractionContextType,\n\tLocale,\n\ttype APIApplicationCommandOptionChoice,\n\ttype LocalizationMap,\n} from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder.js';\nimport type { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands.js';\nimport type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase.js';\n\nconst namePredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(32)\n\t.regex(/^[\\p{Ll}\\p{Lm}\\p{Lo}\\p{N}\\p{sc=Devanagari}\\p{sc=Thai}_-]+$/u)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateName(name: unknown): asserts name is string {\n\tnamePredicate.parse(name);\n}\n\nconst descriptionPredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(100)\n\t.setValidationEnabled(isValidationEnabled);\nconst localePredicate = s.nativeEnum(Locale);\n\nexport function validateDescription(description: unknown): asserts description is string {\n\tdescriptionPredicate.parse(description);\n}\n\nconst maxArrayLengthPredicate = s.unknown().array().lengthLessThanOrEqual(25).setValidationEnabled(isValidationEnabled);\nexport function validateLocale(locale: unknown) {\n\treturn localePredicate.parse(locale);\n}\n\nexport function validateMaxOptionsLength(options: unknown): asserts options is ToAPIApplicationCommandOptions[] {\n\tmaxArrayLengthPredicate.parse(options);\n}\n\nexport function validateRequiredParameters(\n\tname: string,\n\tdescription: string,\n\toptions: ToAPIApplicationCommandOptions[],\n) {\n\t// Assert name matches all conditions\n\tvalidateName(name);\n\n\t// Assert description conditions\n\tvalidateDescription(description);\n\n\t// Assert options conditions\n\tvalidateMaxOptionsLength(options);\n}\n\nconst booleanPredicate = s.boolean();\n\nexport function validateDefaultPermission(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport function validateRequired(required: unknown): asserts required is boolean {\n\tbooleanPredicate.parse(required);\n}\n\nconst choicesLengthPredicate = s.number().lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);\n\nexport function validateChoicesLength(amountAdding: number, choices?: APIApplicationCommandOptionChoice[]): void {\n\tchoicesLengthPredicate.parse((choices?.length ?? 0) + amountAdding);\n}\n\nexport function assertReturnOfBuilder<\n\tReturnType extends ApplicationCommandOptionBase | SlashCommandSubcommandBuilder | SlashCommandSubcommandGroupBuilder,\n>(input: unknown, ExpectedInstanceOf: new () => ReturnType): asserts input is ReturnType {\n\ts.instance(ExpectedInstanceOf).parse(input);\n}\n\nexport const localizationMapPredicate = s\n\t.object(Object.fromEntries(Object.values(Locale).map((locale) => [locale, s.string().nullish()])))\n\t.strict()\n\t.nullish()\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateLocalizationMap(value: unknown): asserts value is LocalizationMap {\n\tlocalizationMapPredicate.parse(value);\n}\n\nconst dmPermissionPredicate = s.boolean().nullish();\n\nexport function validateDMPermission(value: unknown): asserts value is boolean | null | undefined {\n\tdmPermissionPredicate.parse(value);\n}\n\nconst memberPermissionPredicate = s\n\t.union([\n\t\ts.bigint().transform((value) => value.toString()),\n\t\ts\n\t\t\t.number()\n\t\t\t.safeInt()\n\t\t\t.transform((value) => value.toString()),\n\t\ts.string().regex(/^\\d+$/),\n\t])\n\t.nullish();\n\nexport function validateDefaultMemberPermissions(permissions: unknown) {\n\treturn memberPermissionPredicate.parse(permissions);\n}\n\nexport function validateNSFW(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport const contextsPredicate = s.array(\n\ts.nativeEnum(InteractionContextType).setValidationEnabled(isValidationEnabled),\n);\n\nexport const integrationTypesPredicate = s.array(\n\ts.nativeEnum(ApplicationIntegrationType).setValidationEnabled(isValidationEnabled),\n);\n","import type {\n\tAPIApplicationCommandOption,\n\tApplicationIntegrationType,\n\tInteractionContextType,\n\tLocalizationMap,\n\tPermissions,\n} from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription.js';\nimport { SharedSlashCommand } from './mixins/SharedSlashCommand.js';\nimport { SharedSlashCommandOptions } from './mixins/SharedSlashCommandOptions.js';\nimport { SharedSlashCommandSubcommands } from './mixins/SharedSubcommands.js';\n\n/**\n * A builder that creates API-compatible JSON data for slash commands.\n */\n@mix(SharedSlashCommandOptions, SharedNameAndDescription, SharedSlashCommandSubcommands, SharedSlashCommand)\nexport class SlashCommandBuilder {\n\t/**\n\t * The name of this command.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The name localizations of this command.\n\t */\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\t/**\n\t * The description of this command.\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The description localizations of this command.\n\t */\n\tpublic readonly description_localizations?: LocalizationMap;\n\n\t/**\n\t * The options of this command.\n\t */\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\t/**\n\t * The contexts for this command.\n\t */\n\tpublic readonly contexts?: InteractionContextType[];\n\n\t/**\n\t * Whether this command is enabled by default when the application is added to a guild.\n\t *\n\t * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.setDMPermission} instead.\n\t */\n\tpublic readonly default_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The set of permissions represented as a bit set for the command.\n\t */\n\tpublic readonly default_member_permissions: Permissions | null | undefined = undefined;\n\n\t/**\n\t * Indicates whether the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This property is only for global commands.\n\t * @deprecated\n\t * Use {@link SlashCommandBuilder.contexts} instead.\n\t */\n\tpublic readonly dm_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The integration types for this command.\n\t */\n\tpublic readonly integration_types?: ApplicationIntegrationType[];\n\n\t/**\n\t * Whether this command is NSFW.\n\t */\n\tpublic readonly nsfw: boolean | undefined = undefined;\n}\n\nexport interface SlashCommandBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandOptions,\n\t\tSharedSlashCommandSubcommands,\n\t\tSharedSlashCommand {}\n\n/**\n * An interface specifically for slash command subcommands.\n */\nexport interface SlashCommandSubcommandsOnlyBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandSubcommands,\n\t\tSharedSlashCommand {}\n\n/**\n * An interface specifically for slash command options.\n */\nexport interface SlashCommandOptionsOnlyBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandOptions,\n\t\tSharedSlashCommand {}\n\n/**\n * An interface that ensures the `toJSON()` call will return something\n * that can be serialized into API-compatible data.\n */\nexport interface ToAPIApplicationCommandOptions {\n\ttoJSON(): APIApplicationCommandOption;\n}\n","import type { LocaleString, LocalizationMap } from 'discord-api-types/v10';\nimport { validateDescription, validateLocale, validateName } from '../Assertions.js';\n\n/**\n * This mixin holds name and description symbols for slash commands.\n */\nexport class SharedNameAndDescription {\n\t/**\n\t * The name of this command.\n\t */\n\tpublic readonly name!: string;\n\n\t/**\n\t * The name localizations of this command.\n\t */\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\t/**\n\t * The description of this command.\n\t */\n\tpublic readonly description!: string;\n\n\t/**\n\t * The description localizations of this command.\n\t */\n\tpublic readonly description_localizations?: LocalizationMap;\n\n\t/**\n\t * Sets the name of this command.\n\t *\n\t * @param name - The name to use\n\t */\n\tpublic setName(name: string): this {\n\t\t// Assert the name matches the conditions\n\t\tvalidateName(name);\n\n\t\tReflect.set(this, 'name', name);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this command.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\t// Assert the description matches the conditions\n\t\tvalidateDescription(description);\n\n\t\tReflect.set(this, 'description', description);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a name localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedName - The localized name for the given `locale`\n\t */\n\tpublic setNameLocalization(locale: LocaleString, localizedName: string | null) {\n\t\tif (!this.name_localizations) {\n\t\t\tReflect.set(this, 'name_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedName === null) {\n\t\t\tthis.name_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateName(localizedName);\n\n\t\tthis.name_localizations![parsedLocale] = localizedName;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name localizations for this command.\n\t *\n\t * @param localizedNames - The object of localized names to set\n\t */\n\tpublic setNameLocalizations(localizedNames: LocalizationMap | null) {\n\t\tif (localizedNames === null) {\n\t\t\tReflect.set(this, 'name_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'name_localizations', {});\n\n\t\tfor (const args of Object.entries(localizedNames)) {\n\t\t\tthis.setNameLocalization(...(args as [LocaleString, string | null]));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a description localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedDescription - The localized description for the given locale\n\t */\n\tpublic setDescriptionLocalization(locale: LocaleString, localizedDescription: string | null) {\n\t\tif (!this.description_localizations) {\n\t\t\tReflect.set(this, 'description_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedDescription === null) {\n\t\t\tthis.description_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateDescription(localizedDescription);\n\n\t\tthis.description_localizations![parsedLocale] = localizedDescription;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description localizations for this command.\n\t *\n\t * @param localizedDescriptions - The object of localized descriptions to set\n\t */\n\tpublic setDescriptionLocalizations(localizedDescriptions: LocalizationMap | null) {\n\t\tif (localizedDescriptions === null) {\n\t\t\tReflect.set(this, 'description_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'description_localizations', {});\n\t\tfor (const args of Object.entries(localizedDescriptions)) {\n\t\t\tthis.setDescriptionLocalization(...(args as [LocaleString, string | null]));\n\t\t}\n\n\t\treturn this;\n\t}\n}\n","import {\n\tApplicationCommandType,\n\ttype ApplicationIntegrationType,\n\ttype InteractionContextType,\n\ttype LocalizationMap,\n\ttype Permissions,\n\ttype RESTPostAPIChatInputApplicationCommandsJSONBody,\n} from 'discord-api-types/v10';\nimport type { RestOrArray } from '../../../util/normalizeArray.js';\nimport { normalizeArray } from '../../../util/normalizeArray.js';\nimport {\n\tcontextsPredicate,\n\tintegrationTypesPredicate,\n\tvalidateDMPermission,\n\tvalidateDefaultMemberPermissions,\n\tvalidateDefaultPermission,\n\tvalidateLocalizationMap,\n\tvalidateNSFW,\n\tvalidateRequiredParameters,\n} from '../Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder.js';\n\n/**\n * This mixin holds symbols that can be shared in slashcommands independent of options or subcommands.\n */\nexport class SharedSlashCommand {\n\tpublic readonly name: string = undefined!;\n\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\tpublic readonly description: string = undefined!;\n\n\tpublic readonly description_localizations?: LocalizationMap;\n\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\tpublic readonly contexts?: InteractionContextType[];\n\n\t/**\n\t * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.setDMPermission} instead.\n\t */\n\tpublic readonly default_permission: boolean | undefined = undefined;\n\n\tpublic readonly default_member_permissions: Permissions | null | undefined = undefined;\n\n\t/**\n\t * @deprecated Use {@link SharedSlashCommand.contexts} instead.\n\t */\n\tpublic readonly dm_permission: boolean | undefined = undefined;\n\n\tpublic readonly integration_types?: ApplicationIntegrationType[];\n\n\tpublic readonly nsfw: boolean | undefined = undefined;\n\n\t/**\n\t * Sets the contexts of this command.\n\t *\n\t * @param contexts - The contexts\n\t */\n\tpublic setContexts(...contexts: RestOrArray) {\n\t\tReflect.set(this, 'contexts', contextsPredicate.parse(normalizeArray(contexts)));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the integration types of this command.\n\t *\n\t * @param integrationTypes - The integration types\n\t */\n\tpublic setIntegrationTypes(...integrationTypes: RestOrArray) {\n\t\tReflect.set(this, 'integration_types', integrationTypesPredicate.parse(normalizeArray(integrationTypes)));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether the command is enabled by default when the application is added to a guild.\n\t *\n\t * @remarks\n\t * If set to `false`, you will have to later `PUT` the permissions for this command.\n\t * @param value - Whether or not to enable this command by default\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.setDMPermission} instead.\n\t */\n\tpublic setDefaultPermission(value: boolean) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDefaultPermission(value);\n\n\t\tReflect.set(this, 'default_permission', value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the default permissions a member should have in order to run the command.\n\t *\n\t * @remarks\n\t * You can set this to `'0'` to disable the command by default.\n\t * @param permissions - The permissions bit field to set\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t */\n\tpublic setDefaultMemberPermissions(permissions: Permissions | bigint | number | null | undefined) {\n\t\t// Assert the value and parse it\n\t\tconst permissionValue = validateDefaultMemberPermissions(permissions);\n\n\t\tReflect.set(this, 'default_member_permissions', permissionValue);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets if the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This method is only for global commands.\n\t * @param enabled - Whether the command should be enabled in direct messages\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated\n\t * Use {@link SharedSlashCommand.setContexts} instead.\n\t */\n\tpublic setDMPermission(enabled: boolean | null | undefined) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDMPermission(enabled);\n\n\t\tReflect.set(this, 'dm_permission', enabled);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this command is NSFW.\n\t *\n\t * @param nsfw - Whether this command is NSFW\n\t */\n\tpublic setNSFW(nsfw = true) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateNSFW(nsfw);\n\t\tReflect.set(this, 'nsfw', nsfw);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): RESTPostAPIChatInputApplicationCommandsJSONBody {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\tvalidateLocalizationMap(this.name_localizations);\n\t\tvalidateLocalizationMap(this.description_localizations);\n\n\t\treturn {\n\t\t\t...this,\n\t\t\ttype: ApplicationCommandType.ChatInput,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandAttachmentOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command attachment option.\n */\nexport class SlashCommandAttachmentOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic override readonly type = ApplicationCommandOptionType.Attachment as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandAttachmentOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import type { APIApplicationCommandBasicOption, ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { validateRequiredParameters, validateRequired, validateLocalizationMap } from '../Assertions.js';\nimport { SharedNameAndDescription } from './NameAndDescription.js';\n\n/**\n * The base application command option builder that contains common symbols for application command builders.\n */\nexport abstract class ApplicationCommandOptionBase extends SharedNameAndDescription {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic abstract readonly type: ApplicationCommandOptionType;\n\n\t/**\n\t * Whether this option is required.\n\t *\n\t * @defaultValue `false`\n\t */\n\tpublic readonly required: boolean = false;\n\n\t/**\n\t * Sets whether this option is required.\n\t *\n\t * @param required - Whether this option should be required\n\t */\n\tpublic setRequired(required: boolean) {\n\t\t// Assert that you actually passed a boolean\n\t\tvalidateRequired(required);\n\n\t\tReflect.set(this, 'required', required);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\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(): APIApplicationCommandBasicOption;\n\n\t/**\n\t * This method runs required validators on this builder.\n\t */\n\tprotected runRequiredValidations() {\n\t\tvalidateRequiredParameters(this.name, this.description, []);\n\n\t\t// Validate localizations\n\t\tvalidateLocalizationMap(this.name_localizations);\n\t\tvalidateLocalizationMap(this.description_localizations);\n\n\t\t// Assert that you actually passed a boolean\n\t\tvalidateRequired(this.required);\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandBooleanOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command boolean option.\n */\nexport class SlashCommandBooleanOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Boolean as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandBooleanOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandChannelOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionChannelTypesMixin } from '../mixins/ApplicationCommandOptionChannelTypesMixin.js';\n\n/**\n * A slash command channel option.\n */\n@mix(ApplicationCommandOptionChannelTypesMixin)\nexport class SlashCommandChannelOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic override readonly type = ApplicationCommandOptionType.Channel as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandChannelOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandChannelOption extends ApplicationCommandOptionChannelTypesMixin {}\n","import { s } from '@sapphire/shapeshift';\nimport { ChannelType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../../util/normalizeArray';\n\n/**\n * The allowed channel types used for a channel option in a slash command builder.\n *\n * @privateRemarks This can't be dynamic because const enums are erased at runtime.\n * @internal\n */\nconst allowedChannelTypes = [\n\tChannelType.GuildText,\n\tChannelType.GuildVoice,\n\tChannelType.GuildCategory,\n\tChannelType.GuildAnnouncement,\n\tChannelType.AnnouncementThread,\n\tChannelType.PublicThread,\n\tChannelType.PrivateThread,\n\tChannelType.GuildStageVoice,\n\tChannelType.GuildForum,\n\tChannelType.GuildMedia,\n] as const;\n\n/**\n * The type of allowed channel types used for a channel option.\n */\nexport type ApplicationCommandOptionAllowedChannelTypes = (typeof allowedChannelTypes)[number];\n\nconst channelTypesPredicate = s.array(s.union(allowedChannelTypes.map((type) => s.literal(type))));\n\n/**\n * This mixin holds channel type symbols used for options.\n */\nexport class ApplicationCommandOptionChannelTypesMixin {\n\t/**\n\t * The channel types of this option.\n\t */\n\tpublic readonly channel_types?: ApplicationCommandOptionAllowedChannelTypes[];\n\n\t/**\n\t * Adds channel types to this option.\n\t *\n\t * @param channelTypes - The channel types\n\t */\n\tpublic addChannelTypes(...channelTypes: RestOrArray) {\n\t\tif (this.channel_types === undefined) {\n\t\t\tReflect.set(this, 'channel_types', []);\n\t\t}\n\n\t\tthis.channel_types!.push(...channelTypesPredicate.parse(normalizeArray(channelTypes)));\n\n\t\treturn this;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandIntegerOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\n\nconst numberValidator = s.number().int();\n\n/**\n * A slash command integer option.\n */\n@mix(\n\tApplicationCommandNumericOptionMinMaxValueMixin,\n\tApplicationCommandOptionWithAutocompleteMixin,\n\tApplicationCommandOptionWithChoicesMixin,\n)\nexport class SlashCommandIntegerOption\n\textends ApplicationCommandOptionBase\n\timplements ApplicationCommandNumericOptionMinMaxValueMixin\n{\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Integer as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}\n\t */\n\tpublic setMaxValue(max: number): this {\n\t\tnumberValidator.parse(max);\n\n\t\tReflect.set(this, 'max_value', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}\n\t */\n\tpublic setMinValue(min: number): this {\n\t\tnumberValidator.parse(min);\n\n\t\tReflect.set(this, 'min_value', min);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandIntegerOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this } as APIApplicationCommandIntegerOption;\n\t}\n}\n\nexport interface SlashCommandIntegerOption\n\textends ApplicationCommandNumericOptionMinMaxValueMixin,\n\t\tApplicationCommandOptionWithChoicesMixin,\n\t\tApplicationCommandOptionWithAutocompleteMixin {}\n","/**\n * This mixin holds minimum and maximum symbols used for options.\n */\nexport abstract class ApplicationCommandNumericOptionMinMaxValueMixin {\n\t/**\n\t * The maximum value of this option.\n\t */\n\tpublic readonly max_value?: number;\n\n\t/**\n\t * The minimum value of this option.\n\t */\n\tpublic readonly min_value?: number;\n\n\t/**\n\t * Sets the maximum number value of this option.\n\t *\n\t * @param max - The maximum value this option can be\n\t */\n\tpublic abstract setMaxValue(max: number): this;\n\n\t/**\n\t * Sets the minimum number value of this option.\n\t *\n\t * @param min - The minimum value this option can be\n\t */\n\tpublic abstract setMinValue(min: number): this;\n}\n","import { s } from '@sapphire/shapeshift';\nimport type { ApplicationCommandOptionType } from 'discord-api-types/v10';\n\nconst booleanPredicate = s.boolean();\n\n/**\n * This mixin holds choices and autocomplete symbols used for options.\n */\nexport class ApplicationCommandOptionWithAutocompleteMixin {\n\t/**\n\t * Whether this option utilizes autocomplete.\n\t */\n\tpublic readonly autocomplete?: boolean;\n\n\t/**\n\t * The type of this option.\n\t *\n\t * @privateRemarks Since this is present and this is a mixin, this is needed.\n\t */\n\tpublic readonly type!: ApplicationCommandOptionType;\n\n\t/**\n\t * Whether this option uses autocomplete.\n\t *\n\t * @param autocomplete - Whether this option should use autocomplete\n\t */\n\tpublic setAutocomplete(autocomplete: boolean): this {\n\t\t// Assert that you actually passed a boolean\n\t\tbooleanPredicate.parse(autocomplete);\n\n\t\tif (autocomplete && 'choices' in this && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tReflect.set(this, 'autocomplete', autocomplete);\n\n\t\treturn this;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandOptionChoice } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../../util/normalizeArray.js';\nimport { localizationMapPredicate, validateChoicesLength } from '../Assertions.js';\n\nconst stringPredicate = s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100);\nconst numberPredicate = s.number().greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY);\nconst choicesPredicate = s\n\t.object({\n\t\tname: stringPredicate,\n\t\tname_localizations: localizationMapPredicate,\n\t\tvalue: s.union([stringPredicate, numberPredicate]),\n\t})\n\t.array();\n\n/**\n * This mixin holds choices and autocomplete symbols used for options.\n */\nexport class ApplicationCommandOptionWithChoicesMixin {\n\t/**\n\t * The choices of this option.\n\t */\n\tpublic readonly choices?: APIApplicationCommandOptionChoice[];\n\n\t/**\n\t * The type of this option.\n\t *\n\t * @privateRemarks Since this is present and this is a mixin, this is needed.\n\t */\n\tpublic readonly type!: ApplicationCommandOptionType;\n\n\t/**\n\t * Adds multiple choices to this option.\n\t *\n\t * @param choices - The choices to add\n\t */\n\tpublic addChoices(...choices: RestOrArray>): this {\n\t\tconst normalizedChoices = normalizeArray(choices);\n\t\tif (normalizedChoices.length > 0 && 'autocomplete' in this && this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tchoicesPredicate.parse(normalizedChoices);\n\n\t\tif (this.choices === undefined) {\n\t\t\tReflect.set(this, 'choices', []);\n\t\t}\n\n\t\tvalidateChoicesLength(normalizedChoices.length, this.choices);\n\n\t\tfor (const { name, name_localizations, value } of normalizedChoices) {\n\t\t\t// Validate the value\n\t\t\tif (this.type === ApplicationCommandOptionType.String) {\n\t\t\t\tstringPredicate.parse(value);\n\t\t\t} else {\n\t\t\t\tnumberPredicate.parse(value);\n\t\t\t}\n\n\t\t\tthis.choices!.push({ name, name_localizations, value });\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets multiple choices for this option.\n\t *\n\t * @param choices - The choices to set\n\t */\n\tpublic setChoices>(...choices: RestOrArray): this {\n\t\tconst normalizedChoices = normalizeArray(choices);\n\t\tif (normalizedChoices.length > 0 && 'autocomplete' in this && this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tchoicesPredicate.parse(normalizedChoices);\n\n\t\tReflect.set(this, 'choices', []);\n\t\tthis.addChoices(normalizedChoices);\n\n\t\treturn this;\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandMentionableOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command mentionable option.\n */\nexport class SlashCommandMentionableOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Mentionable as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandMentionableOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandNumberOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\n\nconst numberValidator = s.number();\n\n/**\n * A slash command number option.\n */\n@mix(\n\tApplicationCommandNumericOptionMinMaxValueMixin,\n\tApplicationCommandOptionWithAutocompleteMixin,\n\tApplicationCommandOptionWithChoicesMixin,\n)\nexport class SlashCommandNumberOption\n\textends ApplicationCommandOptionBase\n\timplements ApplicationCommandNumericOptionMinMaxValueMixin\n{\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.Number as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}\n\t */\n\tpublic setMaxValue(max: number): this {\n\t\tnumberValidator.parse(max);\n\n\t\tReflect.set(this, 'max_value', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}\n\t */\n\tpublic setMinValue(min: number): this {\n\t\tnumberValidator.parse(min);\n\n\t\tReflect.set(this, 'min_value', min);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandNumberOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this } as APIApplicationCommandNumberOption;\n\t}\n}\n\nexport interface SlashCommandNumberOption\n\textends ApplicationCommandNumericOptionMinMaxValueMixin,\n\t\tApplicationCommandOptionWithChoicesMixin,\n\t\tApplicationCommandOptionWithAutocompleteMixin {}\n","import { ApplicationCommandOptionType, type APIApplicationCommandRoleOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command role option.\n */\nexport class SlashCommandRoleOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic override readonly type = ApplicationCommandOptionType.Role as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandRoleOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandStringOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\n\nconst minLengthValidator = s.number().greaterThanOrEqual(0).lessThanOrEqual(6_000);\nconst maxLengthValidator = s.number().greaterThanOrEqual(1).lessThanOrEqual(6_000);\n\n/**\n * A slash command string option.\n */\n@mix(ApplicationCommandOptionWithAutocompleteMixin, ApplicationCommandOptionWithChoicesMixin)\nexport class SlashCommandStringOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.String as const;\n\n\t/**\n\t * The maximum length of this option.\n\t */\n\tpublic readonly max_length?: number;\n\n\t/**\n\t * The minimum length of this option.\n\t */\n\tpublic readonly min_length?: number;\n\n\t/**\n\t * Sets the maximum length of this string option.\n\t *\n\t * @param max - The maximum length this option can be\n\t */\n\tpublic setMaxLength(max: number): this {\n\t\tmaxLengthValidator.parse(max);\n\n\t\tReflect.set(this, 'max_length', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum length of this string option.\n\t *\n\t * @param min - The minimum length this option can be\n\t */\n\tpublic setMinLength(min: number): this {\n\t\tminLengthValidator.parse(min);\n\n\t\tReflect.set(this, 'min_length', min);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandStringOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this } as APIApplicationCommandStringOption;\n\t}\n}\n\nexport interface SlashCommandStringOption\n\textends ApplicationCommandOptionWithChoicesMixin,\n\t\tApplicationCommandOptionWithAutocompleteMixin {}\n","import { ApplicationCommandOptionType, type APIApplicationCommandUserOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\n/**\n * A slash command user option.\n */\nexport class SlashCommandUserOption extends ApplicationCommandOptionBase {\n\t/**\n\t * The type of this option.\n\t */\n\tpublic readonly type = ApplicationCommandOptionType.User as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandOptionBase.toJSON}\n\t */\n\tpublic toJSON(): APIApplicationCommandUserOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { assertReturnOfBuilder, validateMaxOptionsLength } from '../Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder';\nimport { SlashCommandAttachmentOption } from '../options/attachment.js';\nimport { SlashCommandBooleanOption } from '../options/boolean.js';\nimport { SlashCommandChannelOption } from '../options/channel.js';\nimport { SlashCommandIntegerOption } from '../options/integer.js';\nimport { SlashCommandMentionableOption } from '../options/mentionable.js';\nimport { SlashCommandNumberOption } from '../options/number.js';\nimport { SlashCommandRoleOption } from '../options/role.js';\nimport { SlashCommandStringOption } from '../options/string.js';\nimport { SlashCommandUserOption } from '../options/user.js';\nimport type { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * This mixin holds symbols that can be shared in slash command options.\n *\n * @typeParam TypeAfterAddingOptions - The type this class should return after adding an option.\n */\nexport class SharedSlashCommandOptions<\n\tTypeAfterAddingOptions extends SharedSlashCommandOptions,\n> {\n\tpublic readonly options!: ToAPIApplicationCommandOptions[];\n\n\t/**\n\t * Adds a boolean option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addBooleanOption(\n\t\tinput: SlashCommandBooleanOption | ((builder: SlashCommandBooleanOption) => SlashCommandBooleanOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandBooleanOption);\n\t}\n\n\t/**\n\t * Adds a user option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addUserOption(input: SlashCommandUserOption | ((builder: SlashCommandUserOption) => SlashCommandUserOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandUserOption);\n\t}\n\n\t/**\n\t * Adds a channel option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addChannelOption(\n\t\tinput: SlashCommandChannelOption | ((builder: SlashCommandChannelOption) => SlashCommandChannelOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandChannelOption);\n\t}\n\n\t/**\n\t * Adds a role option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addRoleOption(input: SlashCommandRoleOption | ((builder: SlashCommandRoleOption) => SlashCommandRoleOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandRoleOption);\n\t}\n\n\t/**\n\t * Adds an attachment option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addAttachmentOption(\n\t\tinput: SlashCommandAttachmentOption | ((builder: SlashCommandAttachmentOption) => SlashCommandAttachmentOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandAttachmentOption);\n\t}\n\n\t/**\n\t * Adds a mentionable option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addMentionableOption(\n\t\tinput: SlashCommandMentionableOption | ((builder: SlashCommandMentionableOption) => SlashCommandMentionableOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandMentionableOption);\n\t}\n\n\t/**\n\t * Adds a string option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addStringOption(\n\t\tinput: SlashCommandStringOption | ((builder: SlashCommandStringOption) => SlashCommandStringOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandStringOption);\n\t}\n\n\t/**\n\t * Adds an integer option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addIntegerOption(\n\t\tinput: SlashCommandIntegerOption | ((builder: SlashCommandIntegerOption) => SlashCommandIntegerOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandIntegerOption);\n\t}\n\n\t/**\n\t * Adds a number option.\n\t *\n\t * @param input - A function that returns an option builder or an already built builder\n\t */\n\tpublic addNumberOption(\n\t\tinput: SlashCommandNumberOption | ((builder: SlashCommandNumberOption) => SlashCommandNumberOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandNumberOption);\n\t}\n\n\t/**\n\t * Where the actual adding magic happens. ✨\n\t *\n\t * @param input - The input. What else?\n\t * @param Instance - The instance of whatever is being added\n\t * @internal\n\t */\n\tprivate _sharedAddOptionMethod(\n\t\tinput: OptionBuilder | ((builder: OptionBuilder) => OptionBuilder),\n\t\tInstance: new () => OptionBuilder,\n\t): TypeAfterAddingOptions {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new Instance()) : input;\n\n\t\tassertReturnOfBuilder(result, Instance);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this as unknown as TypeAfterAddingOptions;\n\t}\n}\n","import {\n\tApplicationCommandOptionType,\n\ttype APIApplicationCommandSubcommandGroupOption,\n\ttype APIApplicationCommandSubcommandOption,\n} from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { assertReturnOfBuilder, validateMaxOptionsLength, validateRequiredParameters } from './Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder.js';\nimport type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase.js';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription.js';\nimport { SharedSlashCommandOptions } from './mixins/SharedSlashCommandOptions.js';\n\n/**\n * Represents a folder for subcommands.\n *\n * @see {@link https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups}\n */\n@mix(SharedNameAndDescription)\nexport class SlashCommandSubcommandGroupBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand group.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand group.\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The subcommands within this subcommand group.\n\t */\n\tpublic readonly options: SlashCommandSubcommandBuilder[] = [];\n\n\t/**\n\t * Adds a new subcommand to this group.\n\t *\n\t * @param input - A function that returns a subcommand builder or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t) {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIApplicationCommandSubcommandGroupOption {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.SubcommandGroup,\n\t\t\tname: this.name,\n\t\t\tname_localizations: this.name_localizations,\n\t\t\tdescription: this.description,\n\t\t\tdescription_localizations: this.description_localizations,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandGroupBuilder extends SharedNameAndDescription {}\n\n/**\n * A builder that creates API-compatible JSON data for slash command subcommands.\n *\n * @see {@link https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups}\n */\n@mix(SharedNameAndDescription, SharedSlashCommandOptions)\nexport class SlashCommandSubcommandBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand.\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The options within this subcommand.\n\t */\n\tpublic readonly options: ApplicationCommandOptionBase[] = [];\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): APIApplicationCommandSubcommandOption {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.Subcommand,\n\t\t\tname: this.name,\n\t\t\tname_localizations: this.name_localizations,\n\t\t\tdescription: this.description,\n\t\t\tdescription_localizations: this.description_localizations,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandOptions {}\n","import { assertReturnOfBuilder, validateMaxOptionsLength } from '../Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder.js';\nimport { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from '../SlashCommandSubcommands.js';\n\n/**\n * This mixin holds symbols that can be shared in slash subcommands.\n *\n * @typeParam TypeAfterAddingSubcommands - The type this class should return after adding a subcommand or subcommand group.\n */\nexport class SharedSlashCommandSubcommands<\n\tTypeAfterAddingSubcommands extends SharedSlashCommandSubcommands,\n> {\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\t/**\n\t * Adds a new subcommand group to this command.\n\t *\n\t * @param input - A function that returns a subcommand group builder or an already built builder\n\t */\n\tpublic addSubcommandGroup(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandGroupBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandGroupBuilder) => SlashCommandSubcommandGroupBuilder),\n\t): TypeAfterAddingSubcommands {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandGroupBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandGroupBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this as unknown as TypeAfterAddingSubcommands;\n\t}\n\n\t/**\n\t * Adds a new subcommand to this command.\n\t *\n\t * @param input - A function that returns a subcommand builder or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t): TypeAfterAddingSubcommands {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this as unknown as TypeAfterAddingSubcommands;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandType, ApplicationIntegrationType, InteractionContextType } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport type { ContextMenuCommandType } from './ContextMenuCommandBuilder.js';\n\nconst namePredicate = s\n\t.string()\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(32)\n\t.regex(/\\S/)\n\t.setValidationEnabled(isValidationEnabled);\nconst typePredicate = s\n\t.union([s.literal(ApplicationCommandType.User), s.literal(ApplicationCommandType.Message)])\n\t.setValidationEnabled(isValidationEnabled);\nconst booleanPredicate = s.boolean();\n\nexport function validateDefaultPermission(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport function validateName(name: unknown): asserts name is string {\n\tnamePredicate.parse(name);\n}\n\nexport function validateType(type: unknown): asserts type is ContextMenuCommandType {\n\ttypePredicate.parse(type);\n}\n\nexport function validateRequiredParameters(name: string, type: number) {\n\t// Assert name matches all conditions\n\tvalidateName(name);\n\n\t// Assert type is valid\n\tvalidateType(type);\n}\n\nconst dmPermissionPredicate = s.boolean().nullish();\n\nexport function validateDMPermission(value: unknown): asserts value is boolean | null | undefined {\n\tdmPermissionPredicate.parse(value);\n}\n\nconst memberPermissionPredicate = s\n\t.union([\n\t\ts.bigint().transform((value) => value.toString()),\n\t\ts\n\t\t\t.number()\n\t\t\t.safeInt()\n\t\t\t.transform((value) => value.toString()),\n\t\ts.string().regex(/^\\d+$/),\n\t])\n\t.nullish();\n\nexport function validateDefaultMemberPermissions(permissions: unknown) {\n\treturn memberPermissionPredicate.parse(permissions);\n}\n\nexport const contextsPredicate = s.array(\n\ts.nativeEnum(InteractionContextType).setValidationEnabled(isValidationEnabled),\n);\n\nexport const integrationTypesPredicate = s.array(\n\ts.nativeEnum(ApplicationIntegrationType).setValidationEnabled(isValidationEnabled),\n);\n","import type {\n\tApplicationCommandType,\n\tApplicationIntegrationType,\n\tInteractionContextType,\n\tLocaleString,\n\tLocalizationMap,\n\tPermissions,\n\tRESTPostAPIContextMenuApplicationCommandsJSONBody,\n} from 'discord-api-types/v10';\nimport type { RestOrArray } from '../../util/normalizeArray.js';\nimport { normalizeArray } from '../../util/normalizeArray.js';\nimport { validateLocale, validateLocalizationMap } from '../slashCommands/Assertions.js';\nimport {\n\tvalidateRequiredParameters,\n\tvalidateName,\n\tvalidateType,\n\tvalidateDefaultPermission,\n\tvalidateDefaultMemberPermissions,\n\tvalidateDMPermission,\n\tcontextsPredicate,\n\tintegrationTypesPredicate,\n} from './Assertions.js';\n\n/**\n * The type a context menu command can be.\n */\nexport type ContextMenuCommandType = ApplicationCommandType.Message | ApplicationCommandType.User;\n\n/**\n * A builder that creates API-compatible JSON data for context menu commands.\n */\nexport class ContextMenuCommandBuilder {\n\t/**\n\t * The name of this command.\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The name localizations of this command.\n\t */\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\t/**\n\t * The type of this command.\n\t */\n\tpublic readonly type: ContextMenuCommandType = undefined!;\n\n\t/**\n\t * The contexts for this command.\n\t */\n\tpublic readonly contexts?: InteractionContextType[];\n\n\t/**\n\t * Whether this command is enabled by default when the application is added to a guild.\n\t *\n\t * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.\n\t */\n\tpublic readonly default_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The set of permissions represented as a bit set for the command.\n\t */\n\tpublic readonly default_member_permissions: Permissions | null | undefined = undefined;\n\n\t/**\n\t * Indicates whether the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This property is only for global commands.\n\t * @deprecated\n\t * Use {@link ContextMenuCommandBuilder.contexts} instead.\n\t */\n\tpublic readonly dm_permission: boolean | undefined = undefined;\n\n\t/**\n\t * The integration types for this command.\n\t */\n\tpublic readonly integration_types?: ApplicationIntegrationType[];\n\n\t/**\n\t * Sets the contexts of this command.\n\t *\n\t * @param contexts - The contexts\n\t */\n\tpublic setContexts(...contexts: RestOrArray) {\n\t\tReflect.set(this, 'contexts', contextsPredicate.parse(normalizeArray(contexts)));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets integration types of this command.\n\t *\n\t * @param integrationTypes - The integration types\n\t */\n\tpublic setIntegrationTypes(...integrationTypes: RestOrArray) {\n\t\tReflect.set(this, 'integration_types', integrationTypesPredicate.parse(normalizeArray(integrationTypes)));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name of this command.\n\t *\n\t * @param name - The name to use\n\t */\n\tpublic setName(name: string) {\n\t\t// Assert the name matches the conditions\n\t\tvalidateName(name);\n\n\t\tReflect.set(this, 'name', name);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the type of this command.\n\t *\n\t * @param type - The type to use\n\t */\n\tpublic setType(type: ContextMenuCommandType) {\n\t\t// Assert the type is valid\n\t\tvalidateType(type);\n\n\t\tReflect.set(this, 'type', type);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether the command is enabled by default when the application is added to a guild.\n\t *\n\t * @remarks\n\t * If set to `false`, you will have to later `PUT` the permissions for this command.\n\t * @param value - Whether to enable this command by default\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.\n\t */\n\tpublic setDefaultPermission(value: boolean) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDefaultPermission(value);\n\n\t\tReflect.set(this, 'default_permission', value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the default permissions a member should have in order to run this command.\n\t *\n\t * @remarks\n\t * You can set this to `'0'` to disable the command by default.\n\t * @param permissions - The permissions bit field to set\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t */\n\tpublic setDefaultMemberPermissions(permissions: Permissions | bigint | number | null | undefined) {\n\t\t// Assert the value and parse it\n\t\tconst permissionValue = validateDefaultMemberPermissions(permissions);\n\n\t\tReflect.set(this, 'default_member_permissions', permissionValue);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets if the command is available in direct messages with the application.\n\t *\n\t * @remarks\n\t * By default, commands are visible. This method is only for global commands.\n\t * @param enabled - Whether the command should be enabled in direct messages\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t * @deprecated Use {@link ContextMenuCommandBuilder.setContexts} instead.\n\t */\n\tpublic setDMPermission(enabled: boolean | null | undefined) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDMPermission(enabled);\n\n\t\tReflect.set(this, 'dm_permission', enabled);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a name localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedName - The localized name for the given `locale`\n\t */\n\tpublic setNameLocalization(locale: LocaleString, localizedName: string | null) {\n\t\tif (!this.name_localizations) {\n\t\t\tReflect.set(this, 'name_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedName === null) {\n\t\t\tthis.name_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateName(localizedName);\n\n\t\tthis.name_localizations![parsedLocale] = localizedName;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name localizations for this command.\n\t *\n\t * @param localizedNames - The object of localized names to set\n\t */\n\tpublic setNameLocalizations(localizedNames: LocalizationMap | null) {\n\t\tif (localizedNames === null) {\n\t\t\tReflect.set(this, 'name_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'name_localizations', {});\n\n\t\tfor (const args of Object.entries(localizedNames))\n\t\t\tthis.setNameLocalization(...(args as [LocaleString, string | null]));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): RESTPostAPIContextMenuApplicationCommandsJSONBody {\n\t\tvalidateRequiredParameters(this.name, this.type);\n\n\t\tvalidateLocalizationMap(this.name_localizations);\n\n\t\treturn { ...this };\n\t}\n}\n","import type { APIEmbed } from 'discord-api-types/v10';\n\n/**\n * Calculates the length of the embed.\n *\n * @param data - The embed data to check\n */\nexport function embedLength(data: APIEmbed) {\n\treturn (\n\t\t(data.title?.length ?? 0) +\n\t\t(data.description?.length ?? 0) +\n\t\t(data.fields?.reduce((prev, curr) => prev + curr.name.length + curr.value.length, 0) ?? 0) +\n\t\t(data.footer?.text.length ?? 0) +\n\t\t(data.author?.name.length ?? 0)\n\t);\n}\n"],"mappings":"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","names":["Assertions_exports","s","s","ComponentType","ComponentType","ComponentType","Assertions_exports","s","ComponentType","s","ComponentType","ComponentType","ComponentType","ComponentType","Assertions_exports","placeholderValidator","s","ComponentType","s","placeholderValidator","ComponentType","ComponentType","ComponentType","SelectMenuDefaultValueType","ComponentType","SelectMenuDefaultValueType","ComponentType","SelectMenuDefaultValueType","ComponentType","SelectMenuDefaultValueType","ComponentType","Assertions_exports","s","ChannelType","ComponentType","SelectMenuDefaultValueType","s","ComponentType","ChannelType","SelectMenuDefaultValueType","ComponentType","ComponentType","SelectMenuDefaultValueType","ComponentType","SelectMenuDefaultValueType","ComponentType","ComponentType","placeholderValidator","Assertions_exports","s","ComponentType","s","ComponentType","ComponentType","ComponentType","Assertions_exports","descriptionPredicate","s","ComponentType","ComponentType","descriptionPredicate","s","descriptionPredicate","ComponentType","ComponentType","ComponentType","ComponentType","ComponentType","ComponentType","ComponentType","ComponentType","descriptionPredicate","ComponentType","ComponentType","ComponentType","ComponentType","ComponentType","ComponentType","Assertions_exports","validateRequiredParameters","s","s","validateRequiredParameters","ComponentType","validateRequiredParameters","Assertions_exports","assertReturnOfBuilder","validateRequiredParameters","s","s","descriptionPredicate","validateRequiredParameters","assertReturnOfBuilder","mix","validateRequiredParameters","validateRequiredParameters","ApplicationCommandOptionType","ApplicationCommandOptionType","ApplicationCommandOptionType","s","ChannelType","ChannelType","s","ApplicationCommandOptionType","s","ApplicationCommandOptionType","mix","s","booleanPredicate","s","s","ApplicationCommandOptionType","s","ApplicationCommandOptionType","s","ApplicationCommandOptionType","mix","ApplicationCommandOptionType","ApplicationCommandOptionType","s","ApplicationCommandOptionType","mix","numberValidator","s","ApplicationCommandOptionType","mix","ApplicationCommandOptionType","ApplicationCommandOptionType","s","ApplicationCommandOptionType","mix","minLengthValidator","s","maxLengthValidator","ApplicationCommandOptionType","mix","ApplicationCommandOptionType","ApplicationCommandOptionType","assertReturnOfBuilder","ApplicationCommandOptionType","mix","assertReturnOfBuilder","validateRequiredParameters","ApplicationCommandOptionType","mix","assertReturnOfBuilder","mix","Assertions_exports","contextsPredicate","integrationTypesPredicate","validateDMPermission","validateDefaultMemberPermissions","validateDefaultPermission","validateName","validateRequiredParameters","s","ApplicationCommandType","ApplicationIntegrationType","InteractionContextType","namePredicate","s","ApplicationCommandType","booleanPredicate","validateDefaultPermission","validateName","validateRequiredParameters","dmPermissionPredicate","validateDMPermission","memberPermissionPredicate","validateDefaultMemberPermissions","contextsPredicate","InteractionContextType","integrationTypesPredicate","ApplicationIntegrationType","contextsPredicate","integrationTypesPredicate","validateName","validateDefaultPermission","validateDefaultMemberPermissions","validateDMPermission","validateRequiredParameters"]} \ No newline at end of file diff --git a/node_modules/@discordjs/builders/package.json b/node_modules/@discordjs/builders/package.json index 3958946..93c7666 100644 --- a/node_modules/@discordjs/builders/package.json +++ b/node_modules/@discordjs/builders/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@discordjs/builders", - "version": "1.11.3", + "version": "1.13.1", "description": "A set of builders that you can use when creating your bot", "exports": { ".": { @@ -54,12 +54,12 @@ "funding": "https://github.com/discordjs/discord.js?sponsor", "dependencies": { "@sapphire/shapeshift": "^4.0.0", - "discord-api-types": "^0.38.16", + "discord-api-types": "^0.38.33", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.4", "tslib": "^2.6.3", - "@discordjs/formatters": "^0.6.1", - "@discordjs/util": "^1.1.1" + "@discordjs/formatters": "^0.6.2", + "@discordjs/util": "^1.2.0" }, "devDependencies": { "@favware/cliff-jumper": "^4.1.0", diff --git a/node_modules/@discordjs/formatters/README.md b/node_modules/@discordjs/formatters/README.md index 65ad4b0..f4da774 100644 --- a/node_modules/@discordjs/formatters/README.md +++ b/node_modules/@discordjs/formatters/README.md @@ -9,7 +9,8 @@ npm version npm downloads Build status - Code coverage + Last commit. + Code coverage

Vercel diff --git a/node_modules/@discordjs/formatters/dist/index.d.mts b/node_modules/@discordjs/formatters/dist/index.d.mts index b792965..c45c281 100644 --- a/node_modules/@discordjs/formatters/dist/index.d.mts +++ b/node_modules/@discordjs/formatters/dist/index.d.mts @@ -324,6 +324,13 @@ declare function channelMention(channelId: ChannelI * @param roleId - The role id to format */ declare function roleMention(roleId: RoleId): `<@&${RoleId}>`; +/** + * Formats a role id into a linked role mention. + * + * @typeParam RoleId - This is inferred by the supplied role id + * @param roleId - The role id to format + */ +declare function linkedRoleMention(roleId: RoleId): ``; /** * Formats an application command name, subcommand group name, subcommand name, and id into an application command mention. * @@ -363,7 +370,7 @@ declare function chatInputApplicationCommandMention(emojiId: EmojiId, animated?: false): `<:_:${EmojiId}>`; +declare function formatEmoji(emojiId: EmojiId, animated?: false): `<:emoji:${EmojiId}>`; /** * Formats an animated emoji id into a fully qualified emoji identifier. * @@ -371,7 +378,7 @@ declare function formatEmoji(emojiId: EmojiId, animat * @param emojiId - The emoji id to format * @param animated - Whether the emoji is animated */ -declare function formatEmoji(emojiId: EmojiId, animated?: true): ``; +declare function formatEmoji(emojiId: EmojiId, animated?: true): ``; /** * Formats an emoji id into a fully qualified emoji identifier. * @@ -379,7 +386,7 @@ declare function formatEmoji(emojiId: EmojiId, animat * @param emojiId - The emoji id to format * @param animated - Whether the emoji is animated */ -declare function formatEmoji(emojiId: EmojiId, animated?: boolean): `<:_:${EmojiId}>` | ``; +declare function formatEmoji(emojiId: EmojiId, animated?: boolean): `<:emoji:${EmojiId}>` | ``; /** * Formats a non-animated emoji id and name into a fully qualified emoji identifier. * @@ -575,6 +582,28 @@ declare function applicationDirectory(applicati * @param skuId - The SKU id */ declare function applicationDirectory(applicationId: ApplicationId, skuId: SKUId): `https://discord.com/application-directory/${ApplicationId}/store/${SKUId}`; +/** + * Formats an email address into an email mention. + * + * @typeParam Email - This is inferred by the supplied email address + * @param email - The email address to format + */ +declare function email(email: Email): `<${Email}>`; +/** + * Formats an email address and headers into an email mention. + * + * @typeParam Email - This is inferred by the supplied email address + * @param email - The email address to format + * @param headers - Optional headers to include in the email mention + */ +declare function email(email: Email, headers: Record | undefined): `<${Email}?${string}>`; +/** + * Formats a phone number into a phone number mention. + * + * @typeParam PhoneNumber - This is inferred by the supplied phone number + * @param phoneNumber - The phone number to format. Must start with a `+` sign. + */ +declare function phoneNumber(phoneNumber: PhoneNumber): `<${PhoneNumber}>`; /** * The {@link https://discord.com/developers/docs/reference#message-formatting-timestamp-styles | message formatting timestamp styles} * supported by Discord. @@ -586,10 +615,17 @@ declare const TimestampStyles: { * @example `16:20` */ readonly ShortTime: "t"; + /** + * Medium time format, consisting of hours, minutes, and seconds. + * + * @example `16:20:30` + */ + readonly MediumTime: "T"; /** * Long time format, consisting of hours, minutes, and seconds. * * @example `16:20:30` + * @deprecated Use {@link TimestampStyles.MediumTime} instead. */ readonly LongTime: "T"; /** @@ -601,21 +637,47 @@ declare const TimestampStyles: { /** * Long date format, consisting of day, month, and year. * - * @example `20 April 2021` + * @example `April 20, 2021` */ readonly LongDate: "D"; + /** + * Long date-short time format, consisting of long date and short time. + * + * @example `April 20, 2021 at 16:20` + */ + readonly LongDateShortTime: "f"; /** * Short date-time format, consisting of short date and short time formats. * * @example `20 April 2021 16:20` + * @deprecated Use {@link TimestampStyles.LongDateShortTime} instead. */ readonly ShortDateTime: "f"; + /** + * Full date-short time format, consisting of full date and short time. + * + * @example `Tuesday, April 20, 2021 at 16:20` + */ + readonly FullDateShortTime: "F"; /** * Long date-time format, consisting of long date and short time formats. * * @example `Tuesday, 20 April 2021 16:20` + * @deprecated Use {@link TimestampStyles.FullDateShortTime} instead. */ readonly LongDateTime: "F"; + /** + * Short date, short time format, consisting of short date and short time. + * + * @example `20/04/2021, 16:20` + */ + readonly ShortDateShortTime: "s"; + /** + * Short date, medium time format, consisting of short date and medium time. + * + * @example `20/04/2021, 16:20:30` + */ + readonly ShortDateMediumTime: "S"; /** * Relative time format, consisting of a relative duration format. * @@ -659,7 +721,11 @@ declare enum GuildNavigationMentions { /** * {@link https://support.discord.com/hc/articles/13497665141655 | Server Guide} tab. */ - Guide = "" + Guide = "", + /** + * {@link https://support.discord.com/hc/articles/10388356626711 | Linked Roles} tab. + */ + LinkedRoles = "" } /** @@ -670,4 +736,4 @@ declare enum GuildNavigationMentions { */ declare const version: string; -export { type EscapeMarkdownOptions, Faces, type FormatEmojiOptions, GuildNavigationMentions, HeadingLevel, type RecursiveArray, TimestampStyles, type TimestampStylesString, applicationDirectory, blockQuote, bold, channelLink, channelMention, chatInputApplicationCommandMention, codeBlock, escapeBold, escapeBulletedList, escapeCodeBlock, escapeEscape, escapeHeading, escapeInlineCode, escapeItalic, escapeMarkdown, escapeMaskedLink, escapeNumberedList, escapeSpoiler, escapeStrikethrough, escapeUnderline, formatEmoji, heading, hideLinkEmbed, hyperlink, inlineCode, italic, messageLink, orderedList, quote, roleMention, spoiler, strikethrough, subtext, time, underline, underscore, unorderedList, userMention, version }; +export { type EscapeMarkdownOptions, Faces, type FormatEmojiOptions, GuildNavigationMentions, HeadingLevel, type RecursiveArray, TimestampStyles, type TimestampStylesString, applicationDirectory, blockQuote, bold, channelLink, channelMention, chatInputApplicationCommandMention, codeBlock, email, escapeBold, escapeBulletedList, escapeCodeBlock, escapeEscape, escapeHeading, escapeInlineCode, escapeItalic, escapeMarkdown, escapeMaskedLink, escapeNumberedList, escapeSpoiler, escapeStrikethrough, escapeUnderline, formatEmoji, heading, hideLinkEmbed, hyperlink, inlineCode, italic, linkedRoleMention, messageLink, orderedList, phoneNumber, quote, roleMention, spoiler, strikethrough, subtext, time, underline, underscore, unorderedList, userMention, version }; diff --git a/node_modules/@discordjs/formatters/dist/index.d.ts b/node_modules/@discordjs/formatters/dist/index.d.ts index b792965..c45c281 100644 --- a/node_modules/@discordjs/formatters/dist/index.d.ts +++ b/node_modules/@discordjs/formatters/dist/index.d.ts @@ -324,6 +324,13 @@ declare function channelMention(channelId: ChannelI * @param roleId - The role id to format */ declare function roleMention(roleId: RoleId): `<@&${RoleId}>`; +/** + * Formats a role id into a linked role mention. + * + * @typeParam RoleId - This is inferred by the supplied role id + * @param roleId - The role id to format + */ +declare function linkedRoleMention(roleId: RoleId): ``; /** * Formats an application command name, subcommand group name, subcommand name, and id into an application command mention. * @@ -363,7 +370,7 @@ declare function chatInputApplicationCommandMention(emojiId: EmojiId, animated?: false): `<:_:${EmojiId}>`; +declare function formatEmoji(emojiId: EmojiId, animated?: false): `<:emoji:${EmojiId}>`; /** * Formats an animated emoji id into a fully qualified emoji identifier. * @@ -371,7 +378,7 @@ declare function formatEmoji(emojiId: EmojiId, animat * @param emojiId - The emoji id to format * @param animated - Whether the emoji is animated */ -declare function formatEmoji(emojiId: EmojiId, animated?: true): ``; +declare function formatEmoji(emojiId: EmojiId, animated?: true): ``; /** * Formats an emoji id into a fully qualified emoji identifier. * @@ -379,7 +386,7 @@ declare function formatEmoji(emojiId: EmojiId, animat * @param emojiId - The emoji id to format * @param animated - Whether the emoji is animated */ -declare function formatEmoji(emojiId: EmojiId, animated?: boolean): `<:_:${EmojiId}>` | ``; +declare function formatEmoji(emojiId: EmojiId, animated?: boolean): `<:emoji:${EmojiId}>` | ``; /** * Formats a non-animated emoji id and name into a fully qualified emoji identifier. * @@ -575,6 +582,28 @@ declare function applicationDirectory(applicati * @param skuId - The SKU id */ declare function applicationDirectory(applicationId: ApplicationId, skuId: SKUId): `https://discord.com/application-directory/${ApplicationId}/store/${SKUId}`; +/** + * Formats an email address into an email mention. + * + * @typeParam Email - This is inferred by the supplied email address + * @param email - The email address to format + */ +declare function email(email: Email): `<${Email}>`; +/** + * Formats an email address and headers into an email mention. + * + * @typeParam Email - This is inferred by the supplied email address + * @param email - The email address to format + * @param headers - Optional headers to include in the email mention + */ +declare function email(email: Email, headers: Record | undefined): `<${Email}?${string}>`; +/** + * Formats a phone number into a phone number mention. + * + * @typeParam PhoneNumber - This is inferred by the supplied phone number + * @param phoneNumber - The phone number to format. Must start with a `+` sign. + */ +declare function phoneNumber(phoneNumber: PhoneNumber): `<${PhoneNumber}>`; /** * The {@link https://discord.com/developers/docs/reference#message-formatting-timestamp-styles | message formatting timestamp styles} * supported by Discord. @@ -586,10 +615,17 @@ declare const TimestampStyles: { * @example `16:20` */ readonly ShortTime: "t"; + /** + * Medium time format, consisting of hours, minutes, and seconds. + * + * @example `16:20:30` + */ + readonly MediumTime: "T"; /** * Long time format, consisting of hours, minutes, and seconds. * * @example `16:20:30` + * @deprecated Use {@link TimestampStyles.MediumTime} instead. */ readonly LongTime: "T"; /** @@ -601,21 +637,47 @@ declare const TimestampStyles: { /** * Long date format, consisting of day, month, and year. * - * @example `20 April 2021` + * @example `April 20, 2021` */ readonly LongDate: "D"; + /** + * Long date-short time format, consisting of long date and short time. + * + * @example `April 20, 2021 at 16:20` + */ + readonly LongDateShortTime: "f"; /** * Short date-time format, consisting of short date and short time formats. * * @example `20 April 2021 16:20` + * @deprecated Use {@link TimestampStyles.LongDateShortTime} instead. */ readonly ShortDateTime: "f"; + /** + * Full date-short time format, consisting of full date and short time. + * + * @example `Tuesday, April 20, 2021 at 16:20` + */ + readonly FullDateShortTime: "F"; /** * Long date-time format, consisting of long date and short time formats. * * @example `Tuesday, 20 April 2021 16:20` + * @deprecated Use {@link TimestampStyles.FullDateShortTime} instead. */ readonly LongDateTime: "F"; + /** + * Short date, short time format, consisting of short date and short time. + * + * @example `20/04/2021, 16:20` + */ + readonly ShortDateShortTime: "s"; + /** + * Short date, medium time format, consisting of short date and medium time. + * + * @example `20/04/2021, 16:20:30` + */ + readonly ShortDateMediumTime: "S"; /** * Relative time format, consisting of a relative duration format. * @@ -659,7 +721,11 @@ declare enum GuildNavigationMentions { /** * {@link https://support.discord.com/hc/articles/13497665141655 | Server Guide} tab. */ - Guide = "" + Guide = "", + /** + * {@link https://support.discord.com/hc/articles/10388356626711 | Linked Roles} tab. + */ + LinkedRoles = "" } /** @@ -670,4 +736,4 @@ declare enum GuildNavigationMentions { */ declare const version: string; -export { type EscapeMarkdownOptions, Faces, type FormatEmojiOptions, GuildNavigationMentions, HeadingLevel, type RecursiveArray, TimestampStyles, type TimestampStylesString, applicationDirectory, blockQuote, bold, channelLink, channelMention, chatInputApplicationCommandMention, codeBlock, escapeBold, escapeBulletedList, escapeCodeBlock, escapeEscape, escapeHeading, escapeInlineCode, escapeItalic, escapeMarkdown, escapeMaskedLink, escapeNumberedList, escapeSpoiler, escapeStrikethrough, escapeUnderline, formatEmoji, heading, hideLinkEmbed, hyperlink, inlineCode, italic, messageLink, orderedList, quote, roleMention, spoiler, strikethrough, subtext, time, underline, underscore, unorderedList, userMention, version }; +export { type EscapeMarkdownOptions, Faces, type FormatEmojiOptions, GuildNavigationMentions, HeadingLevel, type RecursiveArray, TimestampStyles, type TimestampStylesString, applicationDirectory, blockQuote, bold, channelLink, channelMention, chatInputApplicationCommandMention, codeBlock, email, escapeBold, escapeBulletedList, escapeCodeBlock, escapeEscape, escapeHeading, escapeInlineCode, escapeItalic, escapeMarkdown, escapeMaskedLink, escapeNumberedList, escapeSpoiler, escapeStrikethrough, escapeUnderline, formatEmoji, heading, hideLinkEmbed, hyperlink, inlineCode, italic, linkedRoleMention, messageLink, orderedList, phoneNumber, quote, roleMention, spoiler, strikethrough, subtext, time, underline, underscore, unorderedList, userMention, version }; diff --git a/node_modules/@discordjs/formatters/dist/index.js b/node_modules/@discordjs/formatters/dist/index.js index da414da..43a2b3b 100644 --- a/node_modules/@discordjs/formatters/dist/index.js +++ b/node_modules/@discordjs/formatters/dist/index.js @@ -19,8 +19,8 @@ var __copyProps = (to, from, except, desc) => { var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts -var src_exports = {}; -__export(src_exports, { +var index_exports = {}; +__export(index_exports, { Faces: () => Faces, GuildNavigationMentions: () => GuildNavigationMentions, HeadingLevel: () => HeadingLevel, @@ -32,6 +32,7 @@ __export(src_exports, { channelMention: () => channelMention, chatInputApplicationCommandMention: () => chatInputApplicationCommandMention, codeBlock: () => codeBlock, + email: () => email, escapeBold: () => escapeBold, escapeBulletedList: () => escapeBulletedList, escapeCodeBlock: () => escapeCodeBlock, @@ -51,8 +52,10 @@ __export(src_exports, { hyperlink: () => hyperlink, inlineCode: () => inlineCode, italic: () => italic, + linkedRoleMention: () => linkedRoleMention, messageLink: () => messageLink, orderedList: () => orderedList, + phoneNumber: () => phoneNumber, quote: () => quote, roleMention: () => roleMention, spoiler: () => spoiler, @@ -65,7 +68,7 @@ __export(src_exports, { userMention: () => userMention, version: () => version }); -module.exports = __toCommonJS(src_exports); +module.exports = __toCommonJS(index_exports); // src/escapers.ts function escapeMarkdown(text, options = {}) { @@ -148,15 +151,21 @@ function escapeInlineCode(text) { __name(escapeInlineCode, "escapeInlineCode"); function escapeItalic(text) { let idx = 0; - const newText = text.replaceAll(/(?<=^|[^*])\*([^*]|\*\*|$)/g, (_, match) => { - if (match === "**") return ++idx % 2 ? `\\*${match}` : `${match}\\*`; - return `\\*${match}`; - }); + const newText = text.replaceAll( + /(?<=^|[^*])(?]*)\*([^*]|\*\*|$)/g, + (_, match) => { + if (match === "**") return ++idx % 2 ? `\\*${match}` : `${match}\\*`; + return `\\*${match}`; + } + ); idx = 0; - return newText.replaceAll(/(?<=^|[^_])(?)([^_]|__|$)/g, (_, match) => { - if (match === "__") return ++idx % 2 ? `\\_${match}` : `${match}\\_`; - return `\\_${match}`; - }); + return newText.replaceAll( + /(?<=^|[^_])(?]*)_(?!:\d+>)([^_]|__|$)/g, + (_, match) => { + if (match === "__") return ++idx % 2 ? `\\_${match}` : `${match}\\_`; + return `\\_${match}`; + } + ); } __name(escapeItalic, "escapeItalic"); function escapeBold(text) { @@ -269,6 +278,10 @@ function roleMention(roleId) { return `<@&${roleId}>`; } __name(roleMention, "roleMention"); +function linkedRoleMention(roleId) { + return ``; +} +__name(linkedRoleMention, "linkedRoleMention"); function chatInputApplicationCommandMention(commandName, subcommandGroupName, subcommandName, commandId) { if (commandId !== void 0) { return ``; @@ -285,7 +298,7 @@ function formatEmoji(emojiIdOrOptions, animated) { animated: animated ?? false } : emojiIdOrOptions; const { id, animated: isAnimated, name: emojiName } = options; - return `<${isAnimated ? "a" : ""}:${emojiName ?? "_"}:${id}>`; + return `<${isAnimated ? "a" : ""}:${emojiName ?? "emoji"}:${id}>`; } __name(formatEmoji, "formatEmoji"); function channelLink(channelId, guildId) { @@ -344,6 +357,23 @@ function applicationDirectory(applicationId, skuId) { return skuId ? `${url}/${skuId}` : url; } __name(applicationDirectory, "applicationDirectory"); +function email(email2, headers) { + if (headers) { + const searchParams = new URLSearchParams( + Object.fromEntries(Object.entries(headers).map(([key, value]) => [key.toLowerCase(), value])) + ); + return `<${email2}?${searchParams.toString()}>`; + } + return `<${email2}>`; +} +__name(email, "email"); +function phoneNumber(phoneNumber2) { + if (!phoneNumber2.startsWith("+")) { + throw new Error('Phone number must start with a "+" sign.'); + } + return `<${phoneNumber2}>`; +} +__name(phoneNumber, "phoneNumber"); var TimestampStyles = { /** * Short time format, consisting of hours and minutes. @@ -351,10 +381,17 @@ var TimestampStyles = { * @example `16:20` */ ShortTime: "t", + /** + * Medium time format, consisting of hours, minutes, and seconds. + * + * @example `16:20:30` + */ + MediumTime: "T", /** * Long time format, consisting of hours, minutes, and seconds. * * @example `16:20:30` + * @deprecated Use {@link TimestampStyles.MediumTime} instead. */ LongTime: "T", /** @@ -366,21 +403,47 @@ var TimestampStyles = { /** * Long date format, consisting of day, month, and year. * - * @example `20 April 2021` + * @example `April 20, 2021` */ LongDate: "D", + /** + * Long date-short time format, consisting of long date and short time. + * + * @example `April 20, 2021 at 16:20` + */ + LongDateShortTime: "f", /** * Short date-time format, consisting of short date and short time formats. * * @example `20 April 2021 16:20` + * @deprecated Use {@link TimestampStyles.LongDateShortTime} instead. */ ShortDateTime: "f", + /** + * Full date-short time format, consisting of full date and short time. + * + * @example `Tuesday, April 20, 2021 at 16:20` + */ + FullDateShortTime: "F", /** * Long date-time format, consisting of long date and short time formats. * * @example `Tuesday, 20 April 2021 16:20` + * @deprecated Use {@link TimestampStyles.FullDateShortTime} instead. */ LongDateTime: "F", + /** + * Short date, short time format, consisting of short date and short time. + * + * @example `20/04/2021, 16:20` + */ + ShortDateShortTime: "s", + /** + * Short date, medium time format, consisting of short date and medium time. + * + * @example `20/04/2021, 16:20:30` + */ + ShortDateMediumTime: "S", /** * Relative time format, consisting of a relative duration format. * @@ -398,11 +461,12 @@ var GuildNavigationMentions = /* @__PURE__ */ ((GuildNavigationMentions2) => { GuildNavigationMentions2["Browse"] = ""; GuildNavigationMentions2["Customize"] = ""; GuildNavigationMentions2["Guide"] = ""; + GuildNavigationMentions2["LinkedRoles"] = ""; return GuildNavigationMentions2; })(GuildNavigationMentions || {}); // src/index.ts -var version = "0.6.1"; +var version = "0.6.2"; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Faces, @@ -416,6 +480,7 @@ var version = "0.6.1"; channelMention, chatInputApplicationCommandMention, codeBlock, + email, escapeBold, escapeBulletedList, escapeCodeBlock, @@ -435,8 +500,10 @@ var version = "0.6.1"; hyperlink, inlineCode, italic, + linkedRoleMention, messageLink, orderedList, + phoneNumber, quote, roleMention, spoiler, diff --git a/node_modules/@discordjs/formatters/dist/index.js.map b/node_modules/@discordjs/formatters/dist/index.js.map index f42dc86..f70802f 100644 --- a/node_modules/@discordjs/formatters/dist/index.js.map +++ b/node_modules/@discordjs/formatters/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.ts","../src/escapers.ts","../src/formatters.ts"],"sourcesContent":["export * from './escapers.js';\nexport * from './formatters.js';\n\n/**\n * The {@link https://github.com/discordjs/discord.js/blob/main/packages/formatters#readme | @discordjs/formatters} version\n * that you are currently using.\n *\n * @privateRemarks This needs to explicitly be `string` so it is not typed as a \"const string\" that gets injected by esbuild.\n */\nexport const version = '0.6.1' as string;\n","/* eslint-disable prefer-named-capture-group */\n\n/**\n * The options that affect what will be escaped.\n */\nexport interface EscapeMarkdownOptions {\n\t/**\n\t * Whether to escape bold text.\n\t *\n\t * @defaultValue `true`\n\t */\n\tbold?: boolean;\n\n\t/**\n\t * Whether to escape bulleted lists.\n\t *\n\t * @defaultValue `false`\n\t */\n\tbulletedList?: boolean;\n\n\t/**\n\t * Whether to escape code blocks.\n\t *\n\t * @defaultValue `true`\n\t */\n\tcodeBlock?: boolean;\n\n\t/**\n\t * Whether to escape text inside code blocks.\n\t *\n\t * @defaultValue `true`\n\t */\n\tcodeBlockContent?: boolean;\n\n\t/**\n\t * Whether to escape `\\`.\n\t *\n\t * @defaultValue `true`\n\t */\n\tescape?: boolean;\n\n\t/**\n\t * Whether to escape headings.\n\t *\n\t * @defaultValue `false`\n\t */\n\theading?: boolean;\n\n\t/**\n\t * Whether to escape inline code.\n\t *\n\t * @defaultValue `true`\n\t */\n\tinlineCode?: boolean;\n\n\t/**\n\t * Whether to escape text inside inline code.\n\t *\n\t * @defaultValue `true`\n\t */\n\tinlineCodeContent?: boolean;\n\t/**\n\t * Whether to escape italics.\n\t *\n\t * @defaultValue `true`\n\t */\n\titalic?: boolean;\n\n\t/**\n\t * Whether to escape masked links.\n\t *\n\t * @defaultValue `false`\n\t */\n\tmaskedLink?: boolean;\n\n\t/**\n\t * Whether to escape numbered lists.\n\t *\n\t * @defaultValue `false`\n\t */\n\tnumberedList?: boolean;\n\n\t/**\n\t * Whether to escape spoilers.\n\t *\n\t * @defaultValue `true`\n\t */\n\tspoiler?: boolean;\n\n\t/**\n\t * Whether to escape strikethroughs.\n\t *\n\t * @defaultValue `true`\n\t */\n\tstrikethrough?: boolean;\n\n\t/**\n\t * Whether to escape underlines.\n\t *\n\t * @defaultValue `true`\n\t */\n\tunderline?: boolean;\n}\n\n/**\n * Escapes any Discord-flavored markdown in a string.\n *\n * @param text - Content to escape\n * @param options - Options for escaping the markdown\n */\nexport function escapeMarkdown(text: string, options: EscapeMarkdownOptions = {}): string {\n\tconst {\n\t\tcodeBlock = true,\n\t\tinlineCode = true,\n\t\tbold = true,\n\t\titalic = true,\n\t\tunderline = true,\n\t\tstrikethrough = true,\n\t\tspoiler = true,\n\t\tcodeBlockContent = true,\n\t\tinlineCodeContent = true,\n\t\tescape = true,\n\t\theading = false,\n\t\tbulletedList = false,\n\t\tnumberedList = false,\n\t\tmaskedLink = false,\n\t} = options;\n\n\tif (!codeBlockContent) {\n\t\treturn text\n\t\t\t.split('```')\n\t\t\t.map((subString, index, array) => {\n\t\t\t\tif (index % 2 && index !== array.length - 1) return subString;\n\t\t\t\treturn escapeMarkdown(subString, {\n\t\t\t\t\tinlineCode,\n\t\t\t\t\tbold,\n\t\t\t\t\titalic,\n\t\t\t\t\tunderline,\n\t\t\t\t\tstrikethrough,\n\t\t\t\t\tspoiler,\n\t\t\t\t\tinlineCodeContent,\n\t\t\t\t\tescape,\n\t\t\t\t\theading,\n\t\t\t\t\tbulletedList,\n\t\t\t\t\tnumberedList,\n\t\t\t\t\tmaskedLink,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.join(codeBlock ? '\\\\`\\\\`\\\\`' : '```');\n\t}\n\n\tif (!inlineCodeContent) {\n\t\treturn text\n\t\t\t.split(/(?<=^|[^`])`(?=[^`]|$)/g)\n\t\t\t.map((subString, index, array) => {\n\t\t\t\tif (index % 2 && index !== array.length - 1) return subString;\n\t\t\t\treturn escapeMarkdown(subString, {\n\t\t\t\t\tcodeBlock,\n\t\t\t\t\tbold,\n\t\t\t\t\titalic,\n\t\t\t\t\tunderline,\n\t\t\t\t\tstrikethrough,\n\t\t\t\t\tspoiler,\n\t\t\t\t\tescape,\n\t\t\t\t\theading,\n\t\t\t\t\tbulletedList,\n\t\t\t\t\tnumberedList,\n\t\t\t\t\tmaskedLink,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.join(inlineCode ? '\\\\`' : '`');\n\t}\n\n\tlet res = text;\n\tif (escape) res = escapeEscape(res);\n\tif (inlineCode) res = escapeInlineCode(res);\n\tif (codeBlock) res = escapeCodeBlock(res);\n\tif (italic) res = escapeItalic(res);\n\tif (bold) res = escapeBold(res);\n\tif (underline) res = escapeUnderline(res);\n\tif (strikethrough) res = escapeStrikethrough(res);\n\tif (spoiler) res = escapeSpoiler(res);\n\tif (heading) res = escapeHeading(res);\n\tif (bulletedList) res = escapeBulletedList(res);\n\tif (numberedList) res = escapeNumberedList(res);\n\tif (maskedLink) res = escapeMaskedLink(res);\n\treturn res;\n}\n\n/**\n * Escapes code block markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeCodeBlock(text: string): string {\n\treturn text.replaceAll('```', '\\\\`\\\\`\\\\`');\n}\n\n/**\n * Escapes inline code markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeInlineCode(text: string): string {\n\treturn text.replaceAll(/(?<=^|[^`])``?(?=[^`]|$)/g, (match) => (match.length === 2 ? '\\\\`\\\\`' : '\\\\`'));\n}\n\n/**\n * Escapes italic markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeItalic(text: string): string {\n\tlet idx = 0;\n\tconst newText = text.replaceAll(/(?<=^|[^*])\\*([^*]|\\*\\*|$)/g, (_, match) => {\n\t\tif (match === '**') return ++idx % 2 ? `\\\\*${match}` : `${match}\\\\*`;\n\t\treturn `\\\\*${match}`;\n\t});\n\tidx = 0;\n\treturn newText.replaceAll(/(?<=^|[^_])(?)([^_]|__|$)/g, (_, match) => {\n\t\tif (match === '__') return ++idx % 2 ? `\\\\_${match}` : `${match}\\\\_`;\n\t\treturn `\\\\_${match}`;\n\t});\n}\n\n/**\n * Escapes bold markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeBold(text: string): string {\n\tlet idx = 0;\n\treturn text.replaceAll(/\\*\\*(\\*)?/g, (_, match) => {\n\t\tif (match) return ++idx % 2 ? `${match}\\\\*\\\\*` : `\\\\*\\\\*${match}`;\n\t\treturn '\\\\*\\\\*';\n\t});\n}\n\n/**\n * Escapes underline markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeUnderline(text: string): string {\n\tlet idx = 0;\n\treturn text.replaceAll(/(?)/g, (_, match) => {\n\t\tif (match) return ++idx % 2 ? `${match}\\\\_\\\\_` : `\\\\_\\\\_${match}`;\n\t\treturn '\\\\_\\\\_';\n\t});\n}\n\n/**\n * Escapes strikethrough markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeStrikethrough(text: string): string {\n\treturn text.replaceAll('~~', '\\\\~\\\\~');\n}\n\n/**\n * Escapes spoiler markdown in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeSpoiler(text: string): string {\n\treturn text.replaceAll('||', '\\\\|\\\\|');\n}\n\n/**\n * Escapes escape characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeEscape(text: string): string {\n\treturn text.replaceAll('\\\\', '\\\\\\\\');\n}\n\n/**\n * Escapes heading characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeHeading(text: string): string {\n\treturn text.replaceAll(/^( {0,2})([*-] )?( *)(#{1,3} )/gm, '$1$2$3\\\\$4');\n}\n\n/**\n * Escapes bulleted list characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeBulletedList(text: string): string {\n\treturn text.replaceAll(/^( *)([*-])( +)/gm, '$1\\\\$2$3');\n}\n\n/**\n * Escapes numbered list characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeNumberedList(text: string): string {\n\treturn text.replaceAll(/^( *\\d+)\\./gm, '$1\\\\.');\n}\n\n/**\n * Escapes masked link characters in a string.\n *\n * @param text - Content to escape\n */\nexport function escapeMaskedLink(text: string): string {\n\treturn text.replaceAll(/\\[.+]\\(.+\\)/gm, '\\\\$&');\n}\n","import type { URL } from 'node:url';\nimport type { Snowflake } from 'discord-api-types/globals';\n\n/**\n * Wraps the content inside a code block with no language.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function codeBlock(content: Content): `\\`\\`\\`\\n${Content}\\n\\`\\`\\``;\n\n/**\n * Wraps the content inside a code block with the specified language.\n *\n * @typeParam Language - This is inferred by the supplied language\n * @typeParam Content - This is inferred by the supplied content\n * @param language - The language for the code block\n * @param content - The content to wrap\n */\nexport function codeBlock(\n\tlanguage: Language,\n\tcontent: Content,\n): `\\`\\`\\`${Language}\\n${Content}\\n\\`\\`\\``;\n\nexport function codeBlock(language: string, content?: string): string {\n\treturn 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 * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function inlineCode(content: Content): `\\`${Content}\\`` {\n\treturn `\\`${content}\\``;\n}\n\n/**\n * Formats the content into italic text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function italic(content: Content): `_${Content}_` {\n\treturn `_${content}_`;\n}\n\n/**\n * Formats the content into bold text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function bold(content: Content): `**${Content}**` {\n\treturn `**${content}**`;\n}\n\n/**\n * Formats the content into underscored text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @deprecated Use {@link underline} instead.\n */\nexport function underscore(content: Content): `__${Content}__` {\n\treturn underline(content);\n}\n\n/**\n * Formats the content into underlined text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function underline(content: Content): `__${Content}__` {\n\treturn `__${content}__`;\n}\n\n/**\n * Formats the content into strike-through text.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function strikethrough(content: Content): `~~${Content}~~` {\n\treturn `~~${content}~~`;\n}\n\n/**\n * Formats the content into a quote.\n *\n * @remarks This needs to be at the start of the line for Discord to format it.\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function quote(content: Content): `> ${Content}` {\n\treturn `> ${content}`;\n}\n\n/**\n * Formats the content into a block quote.\n *\n * @remarks This needs to be at the start of the line for Discord to format it.\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function blockQuote(content: Content): `>>> ${Content}` {\n\treturn `>>> ${content}`;\n}\n\n/**\n * Wraps the URL into `<>` which stops it from embedding.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param url - The URL to wrap\n */\nexport function hideLinkEmbed(url: Content): `<${Content}>`;\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}>`;\n\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 * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to display\n * @param url - The URL the content links to\n */\nexport function hyperlink(content: Content, url: URL): `[${Content}](${string})`;\n\n/**\n * Formats the content and the URL into a masked URL.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @typeParam Url - This is inferred by the supplied URL\n * @param content - The content to display\n * @param url - The URL the content links to\n */\nexport function hyperlink(\n\tcontent: Content,\n\turl: Url,\n): `[${Content}](${Url})`;\n\n/**\n * Formats the content and the URL into a masked URL with a custom tooltip.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @typeParam Title - This is inferred by the supplied title\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: Content,\n\turl: URL,\n\ttitle: Title,\n): `[${Content}](${string} \"${Title}\")`;\n\n/**\n * Formats the content and the URL into a masked URL with a custom tooltip.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @typeParam Url - This is inferred by the supplied URL\n * @typeParam Title - This is inferred by the supplied title\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: Content,\n\turl: Url,\n\ttitle: Title,\n): `[${Content}](${Url} \"${Title}\")`;\n\nexport function hyperlink(content: string, url: URL | string, title?: string) {\n\treturn title ? `[${content}](${url} \"${title}\")` : `[${content}](${url})`;\n}\n\n/**\n * Formats the content into a spoiler.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function spoiler(content: Content): `||${Content}||` {\n\treturn `||${content}||`;\n}\n\n/**\n * Formats a user id into a user mention.\n *\n * @typeParam UserId - This is inferred by the supplied user id\n * @param userId - The user id to format\n */\nexport function userMention(userId: UserId): `<@${UserId}>` {\n\treturn `<@${userId}>`;\n}\n\n/**\n * Formats a channel id into a channel mention.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @param channelId - The channel id to format\n */\nexport function channelMention(channelId: ChannelId): `<#${ChannelId}>` {\n\treturn `<#${channelId}>`;\n}\n\n/**\n * Formats a role id into a role mention.\n *\n * @typeParam RoleId - This is inferred by the supplied role id\n * @param roleId - The role id to format\n */\nexport function roleMention(roleId: RoleId): `<@&${RoleId}>` {\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 * @typeParam CommandName - This is inferred by the supplied command name\n * @typeParam SubcommandGroupName - This is inferred by the supplied subcommand group name\n * @typeParam SubcommandName - This is inferred by the supplied subcommand name\n * @typeParam CommandId - This is inferred by the supplied command id\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\tCommandName extends string,\n\tSubcommandGroupName extends string,\n\tSubcommandName extends string,\n\tCommandId extends Snowflake,\n>(\n\tcommandName: CommandName,\n\tsubcommandGroupName: SubcommandGroupName,\n\tsubcommandName: SubcommandName,\n\tcommandId: CommandId,\n): ``;\n\n/**\n * Formats an application command name, subcommand name, and id into an application command mention.\n *\n * @typeParam CommandName - This is inferred by the supplied command name\n * @typeParam SubcommandName - This is inferred by the supplied subcommand name\n * @typeParam CommandId - This is inferred by the supplied command id\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 extends string,\n\tSubcommandName extends string,\n\tCommandId extends Snowflake,\n>(\n\tcommandName: CommandName,\n\tsubcommandName: SubcommandName,\n\tcommandId: CommandId,\n): ``;\n\n/**\n * Formats an application command name and id into an application command mention.\n *\n * @typeParam CommandName - This is inferred by the supplied command name\n * @typeParam CommandId - This is inferred by the supplied command id\n * @param commandName - The application command name to format\n * @param commandId - The application command id to format\n */\nexport function chatInputApplicationCommandMention(\n\tcommandName: CommandName,\n\tcommandId: CommandId,\n): ``;\n\nexport function chatInputApplicationCommandMention<\n\tCommandName extends string,\n\tSubcommandGroupName extends Snowflake | string,\n\tSubcommandName extends Snowflake | string,\n\tCommandId extends Snowflake,\n>(\n\tcommandName: CommandName,\n\tsubcommandGroupName: SubcommandGroupName,\n\tsubcommandName?: SubcommandName,\n\tcommandId?: CommandId,\n):\n\t| ``\n\t| ``\n\t| `` {\n\tif (commandId !== undefined) {\n\t\treturn ``;\n\t}\n\n\tif (subcommandName !== undefined) {\n\t\treturn ``;\n\t}\n\n\treturn ``;\n}\n\n/**\n * Formats a non-animated emoji id into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @param emojiId - The emoji id to format\n */\nexport function formatEmoji(emojiId: EmojiId, animated?: false): `<:_:${EmojiId}>`;\n\n/**\n * Formats an animated emoji id into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @param emojiId - The emoji id to format\n * @param animated - Whether the emoji is animated\n */\nexport function formatEmoji(emojiId: EmojiId, animated?: true): ``;\n\n/**\n * Formats an emoji id into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @param emojiId - The emoji id to format\n * @param animated - Whether the emoji is animated\n */\nexport function formatEmoji(\n\temojiId: EmojiId,\n\tanimated?: boolean,\n): `<:_:${EmojiId}>` | ``;\n\n/**\n * Formats a non-animated emoji id and name into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied name\n * @param options - The options for formatting an emoji\n */\nexport function formatEmoji(\n\toptions: FormatEmojiOptions & { animated: true },\n): ``;\n\n/**\n * Formats an animated emoji id and name into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied name\n * @param options - The options for formatting an emoji\n */\nexport function formatEmoji(\n\toptions: FormatEmojiOptions & { animated?: false },\n): `<:${EmojiName}:${EmojiId}>`;\n\n/**\n * Formats an emoji id and name into a fully qualified emoji identifier.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied emoji name\n * @param options - The options for formatting an emoji\n */\nexport function formatEmoji(\n\toptions: FormatEmojiOptions,\n): `<:${EmojiName}:${EmojiId}>` | ``;\n\nexport function formatEmoji(\n\temojiIdOrOptions: EmojiId | FormatEmojiOptions,\n\tanimated?: boolean,\n): `<:${string}:${EmojiId}>` | `` {\n\tconst options =\n\t\ttypeof emojiIdOrOptions === 'string'\n\t\t\t? {\n\t\t\t\t\tid: emojiIdOrOptions,\n\t\t\t\t\tanimated: animated ?? false,\n\t\t\t\t}\n\t\t\t: emojiIdOrOptions;\n\n\tconst { id, animated: isAnimated, name: emojiName } = options;\n\n\treturn `<${isAnimated ? 'a' : ''}:${emojiName ?? '_'}:${id}>`;\n}\n\n/**\n * The options for formatting an emoji.\n *\n * @typeParam EmojiId - This is inferred by the supplied emoji id\n * @typeParam EmojiName - This is inferred by the supplied emoji name\n */\nexport interface FormatEmojiOptions {\n\t/**\n\t * Whether the emoji is animated\n\t */\n\tanimated?: boolean;\n\t/**\n\t * The emoji id to format\n\t */\n\tid: EmojiId;\n\t/**\n\t * The name of the emoji\n\t */\n\tname?: EmojiName;\n}\n\n/**\n * Formats a channel link for a direct message channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @param channelId - The channel's id\n */\nexport function channelLink(\n\tchannelId: ChannelId,\n): `https://discord.com/channels/@me/${ChannelId}`;\n\n/**\n * Formats a channel link for a guild channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @typeParam GuildId - This is inferred by the supplied guild id\n * @param channelId - The channel's id\n * @param guildId - The guild's id\n */\nexport function channelLink(\n\tchannelId: ChannelId,\n\tguildId: GuildId,\n): `https://discord.com/channels/${GuildId}/${ChannelId}`;\n\nexport function channelLink(\n\tchannelId: ChannelId,\n\tguildId?: GuildId,\n): `https://discord.com/channels/@me/${ChannelId}` | `https://discord.com/channels/${GuildId}/${ChannelId}` {\n\treturn `https://discord.com/channels/${guildId ?? '@me'}/${channelId}`;\n}\n\n/**\n * Formats a message link for a direct message channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @typeParam MessageId - This is inferred by the supplied message id\n * @param channelId - The channel's id\n * @param messageId - The message's id\n */\nexport function messageLink(\n\tchannelId: ChannelId,\n\tmessageId: MessageId,\n): `https://discord.com/channels/@me/${ChannelId}/${MessageId}`;\n\n/**\n * Formats a message link for a guild channel.\n *\n * @typeParam ChannelId - This is inferred by the supplied channel id\n * @typeParam MessageId - This is inferred by the supplied message id\n * @typeParam GuildId - This is inferred by the supplied guild id\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: ChannelId,\n\tmessageId: MessageId,\n\tguildId: GuildId,\n): `https://discord.com/channels/${GuildId}/${ChannelId}/${MessageId}`;\n\nexport function messageLink(\n\tchannelId: ChannelId,\n\tmessageId: MessageId,\n\tguildId?: GuildId,\n):\n\t| `https://discord.com/channels/@me/${ChannelId}/${MessageId}`\n\t| `https://discord.com/channels/${GuildId}/${ChannelId}/${MessageId}` {\n\treturn `${guildId === undefined ? channelLink(channelId) : channelLink(channelId, guildId)}/${messageId}`;\n}\n\n/**\n * The heading levels for expanded markdown.\n */\nexport enum HeadingLevel {\n\t/**\n\t * The first heading level.\n\t */\n\tOne = 1,\n\t/**\n\t * The second heading level.\n\t */\n\tTwo,\n\t/**\n\t * The third heading level.\n\t */\n\tThree,\n}\n\n/**\n * Formats the content into a heading level.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @param level - The heading level\n */\nexport function heading(content: Content, level?: HeadingLevel.One): `# ${Content}`;\n\n/**\n * Formats the content into a heading level.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @param level - The heading level\n */\nexport function heading(content: Content, level: HeadingLevel.Two): `## ${Content}`;\n\n/**\n * Formats the content into a heading level.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n * @param level - The heading level\n */\nexport function heading(content: Content, level: HeadingLevel.Three): `### ${Content}`;\n\nexport function heading(content: string, level?: HeadingLevel) {\n\tswitch (level) {\n\t\tcase HeadingLevel.Three:\n\t\t\treturn `### ${content}`;\n\t\tcase HeadingLevel.Two:\n\t\t\treturn `## ${content}`;\n\t\tdefault:\n\t\t\treturn `# ${content}`;\n\t}\n}\n\n/**\n * A type that recursively traverses into arrays.\n */\nexport type RecursiveArray = readonly (ItemType | RecursiveArray)[];\n\n/**\n * Callback function for list formatters.\n *\n * @internal\n */\nfunction listCallback(element: RecursiveArray, startNumber?: number, depth = 0): string {\n\tif (Array.isArray(element)) {\n\t\treturn element.map((element) => listCallback(element, startNumber, depth + 1)).join('\\n');\n\t}\n\n\treturn `${' '.repeat(depth - 1)}${startNumber ? `${startNumber}.` : '-'} ${element}`;\n}\n\n/**\n * Formats the elements in the array to an ordered list.\n *\n * @param list - The array of elements to list\n * @param startNumber - The starting number for the list\n */\nexport function orderedList(list: RecursiveArray, startNumber = 1): string {\n\treturn listCallback(list, Math.max(startNumber, 1));\n}\n\n/**\n * Formats the elements in the array to an unordered list.\n *\n * @param list - The array of elements to list\n */\nexport function unorderedList(list: RecursiveArray): string {\n\treturn listCallback(list);\n}\n\n/**\n * Formats the content into a subtext.\n *\n * @typeParam Content - This is inferred by the supplied content\n * @param content - The content to wrap\n */\nexport function subtext(content: Content): `-# ${Content}` {\n\treturn `-# ${content}`;\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 * @typeParam Style - This is inferred by the supplied {@link TimestampStylesString}\n * @param date - The date to format\n * @param style - The style to use\n */\nexport function time + Dashboard • Femboy Croissant + ${COMMON_HEAD} -

+ -
-
-
-
📊
-
Tickets Totaux
-
${stats.totalTickets}
-
-
-
📝
-
Mes Tickets
-
${stats.myTickets}
-
-
-
🔓
-
Tickets Ouverts
-
${stats.openTickets}
-
-
-
🔒
-
Tickets Fermés
-
${stats.closedTickets}
-
-
+
+
+

Vue d'ensemble

+ Bienvenue, ${escapeHtml(user.username)} +
-
-

📄 Mes Tickets

- ${userTickets.length > 0 ? ` -
- ${userTickets.map(ticket => generateTicketCard(ticket)).join('')} -
- ` : '
Aucun ticket réclamé.
'} -
+ ${statsHTML} -
-

🌐 Tous les Transcripts

-

Voir tous les transcripts sur la page dédiée.

- ${allTickets.length > 0 ? ` -
- ${allTickets.slice(0, 6).map(ticket => generateTicketCard(ticket)).join('')} -
- ${allTickets.length > 6 ? `

Voir tous les transcripts (${allTickets.length})

` : ''} - ` : '
Aucun transcript disponible.
'} -
-
+
+

${myTicketsTitle}

+ ${userTickets.length > 0 ? `
${userTickets.map(ticket => generateTicketCard(ticket)).join('')}
` : '
Aucun ticket trouvé.
'} +
+ + ${allTicketsHTML} +
`; } -// Fonction pour formater la date selon le fuseau horaire (France par défaut) -// Format: "9/11/2025, 18h43" (format français court avec heure) -function formatDate(timestamp, timezone = 'Europe/Paris') { - try { - const date = new Date(timestamp); - - // Utiliser Intl.DateTimeFormat pour gérer correctement les fuseaux horaires - const formatter = new Intl.DateTimeFormat('fr-FR', { - timeZone: timezone, - year: 'numeric', - month: 'numeric', - day: 'numeric', - hour: '2-digit', - minute: '2-digit', - hour12: false - }); - - // Formater la date - const parts = formatter.formatToParts(date); - const day = parts.find(p => p.type === 'day').value; - const month = parts.find(p => p.type === 'month').value; - const year = parts.find(p => p.type === 'year').value; - const hour = parts.find(p => p.type === 'hour').value; - const minute = parts.find(p => p.type === 'minute').value; - - return `${day}/${month}/${year}, ${hour}h${minute}`; - } catch (err) { - // Fallback sur le format français standard - const date = new Date(timestamp); - const day = date.getDate(); - const month = date.getMonth() + 1; - const year = date.getFullYear(); - const hours = date.getHours().toString().padStart(2, '0'); - const minutes = date.getMinutes().toString().padStart(2, '0'); - return `${day}/${month}/${year}, ${hours}h${minutes}`; - } +function generateTranscriptsPageHTML(user, tickets) { + const userAvatar = user.avatar + ? `https://cdn.discordapp.com/avatars/${user.id}/${user.avatar}.png` + : `https://cdn.discordapp.com/embed/avatars/${parseInt(user.id) % 5}.png`; + + return ` + + + Transcripts • Femboy Croissant + ${COMMON_HEAD} + + + + + +
+
+

Archives des Tickets

+
+ + + + + +
+
+ +
+ ${tickets.length > 0 ? ` +
+ + + + + + + + + + + + + + ${tickets.map(t => generateTableRow(t, true)).join('')} + +
IDTypeCréateurGéré parDateStatutAction
+
+ ` : ` +
+
+

Aucun transcript disponible.

+
+ `} +
+
+ +`; +} + +function generateTableRow(ticket, showModerator = false) { + const date = new Date(ticket.createdAt).toLocaleDateString('fr-FR', { day: '2-digit', month: 'short', year: 'numeric', hour: '2-digit', minute: '2-digit' }); + + let url = ticket.transcriptPath || '#'; + if (url !== '#' && !url.startsWith('transcripts/') && !url.startsWith('/transcripts/')) { + url = `/transcripts/${url}`; + } else if (url !== '#' && !url.startsWith('/')) { + url = `/${url}`; + } + + const statusClass = `status-${ticket.status.toLowerCase().replace(' ', '-')}`; + + let modCell = ''; + if (showModerator) { + const mod = ticket.claimedByTag ? escapeHtml(ticket.claimedByTag) : (ticket.claimedBy ? 'Modérateur' : '-'); + modCell = `${mod}`; + } + + return ` + + ${ticket.ticketId} + ${ticket.type} + ${escapeHtml(ticket.userTag)} + ${modCell} + ${date} + ${ticket.status} + + ${ticket.transcriptPath ? + ` Voir` : + `` + } + + + `; } function generateTicketCard(ticket) { - const date = formatDate(ticket.createdAt); - - const url = ticket.transcriptPath ? `/${ticket.transcriptPath}` : '#'; - const typeClass = `type-${ticket.type.toLowerCase().replace(/\s+/g, '-')}`; - const statusClass = `status-${ticket.status.toLowerCase()}`; - - const typeEmojis = { - 'Support': '💬', - 'Plainte': '📢', - 'Plainte Staff': '⚠️', - 'Candidature': '📝', - 'Problème Technique': '🔧' - }; + const date = formatDate(ticket.createdAt); + + let url = ticket.transcriptPath || '#'; + if (url !== '#' && !url.startsWith('transcripts/') && !url.startsWith('/transcripts/')) { + url = `/transcripts/${url}`; + } else if (url !== '#' && !url.startsWith('/')) { + url = `/${url}`; + } - return ` -
-
-
${typeEmojis[ticket.type] || '🎫'} ${ticket.ticketId}
- ${ticket.type} -
-
-
Créé par: ${escapeHtml(ticket.userTag)}
- ${ticket.claimedBy ? `
Géré par: ${ticket.claimedByTag || 'Modérateur'}
` : ''} -
Date: ${date}
-
-
- ${ticket.status} -
- ${ticket.transcriptPath ? `Voir le transcript` : 'Transcript non disponible'} -
- `; + const typeEmojis = { 'Support': '💬', 'Plainte': '📢', 'Plainte Staff': '⚠️', 'Candidature': '📝', 'Problème Technique': '🔧' }; + + return ` +
+
+
${typeEmojis[ticket.type] || '🎫'} ${ticket.ticketId}
+ ${ticket.type} +
+
+
Créé par: ${escapeHtml(ticket.userTag)}
+ ${ticket.claimedBy ? `
Géré par: ${ticket.claimedByTag || 'Modérateur'}
` : ''} +
Date: ${date}
+
+
${ticket.status}
+ ${ticket.transcriptPath ? `Voir le transcript` : 'Transcript non disponible'} +
+ `; +} + +function formatDate(timestamp) { + try { + return new Intl.DateTimeFormat('fr-FR', { + timeZone: 'Europe/Paris', year: 'numeric', month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit' + }).format(new Date(timestamp)); + } catch { return new Date(timestamp).toLocaleString(); } } function escapeHtml(text) { - if (!text) return ''; - const map = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' - }; - return text.replace(/[&<>"']/g, m => map[m]); + if (!text) return ''; + return text.replace(/[&<>"']/g, m => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[m]); } // Routes app.get('/login', (req, res) => { - res.send(` - - - - - - Connexion - Transcripts - - - - - - - `); + res.send(` + + + Connexion + ${COMMON_HEAD} + + + +
+

🔐 Accès Restreint

+

Veuillez vous connecter avec votre compte Discord pour accéder aux archives.

+ + Se connecter avec Discord + +
+ + `); }); app.get('/auth/discord', (req, res, next) => { - if (!discordStrategyConfigured) { - return res.send(` - - - - Erreur de Configuration - - - -
-

⚠️ Discord OAuth non configuré

-

Pour utiliser l'authentification Discord, vous devez :

-
    -
  1. Installer passport-discord : npm install passport-discord
  2. -
  3. Configurer DISCORD_CLIENT_ID et DISCORD_CLIENT_SECRET dans .env
  4. -
  5. Configurer DISCORD_CALLBACK_URL dans .env
  6. -
-

Voir server/README.md pour plus d'informations.

-
- - - `); - } - passport.authenticate('discord')(req, res, next); + if (!discordStrategyConfigured) return res.send('Erreur configuration OAuth'); + passport.authenticate('discord')(req, res, next); }); app.get('/auth/discord/callback', - (req, res, next) => { - if (!discordStrategyConfigured) { - return res.redirect('/login?error=not_configured'); - } - passport.authenticate('discord', { failureRedirect: '/login?error=auth_failed' })(req, res, next); - }, - (req, res) => { - res.redirect('/'); - } + (req, res, next) => { + if (!discordStrategyConfigured) return res.redirect('/login?error=not_configured'); + passport.authenticate('discord', { failureRedirect: '/login?error=auth_failed' })(req, res, next); + }, + (req, res) => res.redirect('/') ); app.get('/auth/logout', (req, res) => { - req.logout(() => { - res.redirect('/login'); - }); + req.logout(() => res.redirect('/login')); }); -// Servir les fichiers statiques (CSS, JS, images, etc.) -// IMPORTANT: Cette route doit être AVANT les routes avec wildcards app.use('/static', express.static(path.join(__dirname, 'public'))); -// Servir les fichiers de transcripts -// Support à la fois /tickets/* et /transcripts/* pour compatibilité -app.get('/tickets/*', isAuthenticated, hasPermission, (req, res) => { - const filePath = req.params[0]; // Ex: plainte/2025-11-09/file.html - // Les fichiers sont toujours dans transcripts/, même si l'URL est /tickets/ - const fullPath = path.join(process.cwd(), 'transcripts', filePath); - - if (!fs.existsSync(fullPath)) { - return res.status(404).send('Transcript introuvable.'); - } - - res.sendFile(fullPath); +// --- FIX CSS: Route explicite avec Header --- +app.get('*/transcript.css', (req, res) => { + res.setHeader('Content-Type', 'text/css'); + res.sendFile(path.join(process.cwd(), 'transcripts', 'transcript.css')); }); -app.get('/transcripts/*', isAuthenticated, hasPermission, (req, res) => { - const filePath = req.params[0]; // Ex: plainte/2025-11-09/file.html - // Les fichiers sont dans transcripts/ - const fullPath = path.join(process.cwd(), 'transcripts', filePath); - - if (!fs.existsSync(fullPath)) { - return res.status(404).send('Transcript introuvable.'); - } - - res.sendFile(fullPath); +app.get(['/tickets/*', '/transcripts/*'], isAuthenticated, hasPermission, (req, res) => { + const filePath = req.params[0]; + const fullPath = path.join(process.cwd(), 'transcripts', filePath); + if (!fs.existsSync(fullPath)) return res.status(404).send('Transcript introuvable.'); + res.sendFile(fullPath); }); -// Page d'accueil (Dashboard) app.get('/', isAuthenticated, async (req, res) => { - try { - const userId = req.user.id; + try { + const userId = req.user.id; + const isMod = isModerator(req.user); - // Récupérer les statistiques - const [totalStats] = await db.query('SELECT COUNT(*) as total FROM tickets'); - const [myTicketsStats] = await db.query('SELECT COUNT(*) as total FROM tickets WHERE claimedBy = ?', [userId]); - const [openStats] = await db.query('SELECT COUNT(*) as total FROM tickets WHERE status = ?', ['Ouvert']); - const [closedStats] = await db.query('SELECT COUNT(*) as total FROM tickets WHERE status = ?', ['Fermé']); + let stats = {}; + let userTickets = []; + let allTickets = []; - const stats = { - totalTickets: totalStats[0].total, - myTickets: myTicketsStats[0].total, - openTickets: openStats[0].total, - closedTickets: closedStats[0].total - }; + if (isMod) { + const [totalStats] = await db.query('SELECT COUNT(*) as total FROM tickets'); + const [myTicketsStats] = await db.query('SELECT COUNT(*) as total FROM tickets WHERE claimedBy = ?', [userId]); + const [openStats] = await db.query('SELECT COUNT(*) as total FROM tickets WHERE status = ?', ['Ouvert']); + const [closedStats] = await db.query('SELECT COUNT(*) as total FROM tickets WHERE status = ?', ['Fermé']); - // Récupérer les tickets claimés par l'utilisateur (pour "Mes Tickets") - const [userTickets] = await db.query( - 'SELECT * FROM tickets WHERE claimedBy = ? AND transcriptPath IS NOT NULL ORDER BY createdAt DESC LIMIT 20', - [userId] - ); + stats = { + totalTickets: totalStats[0].total, + myTickets: myTicketsStats[0].total, + openTickets: openStats[0].total, + closedTickets: closedStats[0].total + }; - // Récupérer tous les transcripts accessibles (avec transcriptPath) pour la page dédiée - const [allTickets] = await db.query( - 'SELECT * FROM tickets WHERE transcriptPath IS NOT NULL ORDER BY createdAt DESC', - [] - ); + [userTickets] = await db.query('SELECT * FROM tickets WHERE claimedBy = ? AND transcriptPath IS NOT NULL ORDER BY createdAt DESC LIMIT 10', [userId]); + [allTickets] = await db.query('SELECT * FROM tickets WHERE transcriptPath IS NOT NULL ORDER BY createdAt DESC LIMIT 10', []); + } else { + [userTickets] = await db.query('SELECT * FROM tickets WHERE userId = ? AND transcriptPath IS NOT NULL ORDER BY createdAt DESC LIMIT 20', [userId]); + } - const html = generateDashboardHTML(req.user, stats, userTickets, allTickets); - res.send(html); - - } catch (err) { - console.error('Erreur lors de la génération du dashboard:', err); - res.status(500).send('Erreur serveur.'); - } + res.send(generateDashboardHTML(req.user, stats, userTickets, allTickets, isMod)); + } catch (err) { + console.error('Erreur dashboard:', err); + res.status(500).send('Erreur serveur.'); + } }); -// Page dédiée pour tous les transcripts (tableau) app.get('/transcripts', isAuthenticated, async (req, res) => { - try { - const userId = req.user.id; + if (!isModerator(req.user)) return res.status(403).send('Accès refusé.'); - // Récupérer tous les transcripts avec les informations des modérateurs - const [allTickets] = await db.query( - `SELECT * FROM tickets - WHERE transcriptPath IS NOT NULL - ORDER BY createdAt DESC`, - [] - ); - - // Récupérer les informations des modérateurs qui ont claim les tickets - // Note: On pourrait utiliser l'API Discord pour récupérer les vrais noms, mais pour l'instant on utilise les tags stockés - // Pour améliorer, on pourrait créer une table de cache des utilisateurs Discord - - const html = generateTranscriptsPageHTML(req.user, allTickets); - res.send(html); - - } catch (err) { - console.error('Erreur lors de la génération de la page transcripts:', err); - res.status(500).send('Erreur serveur.'); - } + try { + const [allTickets] = await db.query('SELECT * FROM tickets WHERE transcriptPath IS NOT NULL ORDER BY createdAt DESC', []); + res.send(generateTranscriptsPageHTML(req.user, allTickets)); + } catch (err) { + console.error('Erreur transcripts:', err); + res.status(500).send('Erreur serveur.'); + } }); -// Fonction pour générer la page HTML des transcripts avec tableau -function generateTranscriptsPageHTML(user, tickets) { - // Gérer les nouveaux et anciens formats de Discord (discriminator peut être null ou '0') - let userAvatar; - if (user.avatar) { - userAvatar = `https://cdn.discordapp.com/avatars/${user.id}/${user.avatar}.png?size=128`; - } else if (user.discriminator && user.discriminator !== '0') { - userAvatar = `https://cdn.discordapp.com/embed/avatars/${user.discriminator % 5}.png`; - } else { - userAvatar = `https://cdn.discordapp.com/embed/avatars/${parseInt(user.id) % 5}.png`; - } - - const typeEmojis = { - 'Support': '💬', - 'Plainte': '📢', - 'Plainte Staff': '⚠️', - 'Candidature': '📝', - 'Problème Technique': '🔧' - }; - - const statusColors = { - 'Ouvert': '#10b981', - 'Fermé': '#ef4444', - 'En attente': '#f59e0b', - 'Supprimé': '#6b7280' - }; - - return ` - - - - - Tous les Transcripts - France Femboy - - - - - -
-
-

📋 Tous les Transcripts

- ${tickets.length > 0 ? ` -
- - - - - - - - - - - - - ${tickets.map(ticket => { - const typeClass = `type-${ticket.type.toLowerCase().replace(/\s+/g, '-')}`; - const statusColor = statusColors[ticket.status] || '#6b7280'; - const date = formatDate(ticket.createdAt); - const url = ticket.transcriptPath ? `/${ticket.transcriptPath}` : '#'; - - // Récupérer le nom du modérateur qui a claim le ticket - let moderatorDisplay = 'Non assigné'; - if (ticket.claimedBy && ticket.claimedByTag) { - moderatorDisplay = `Géré par: ${escapeHtml(ticket.claimedByTag)}`; - } else if (ticket.claimedBy) { - moderatorDisplay = 'Géré par: Modérateur'; - } - - return ` - - - - - - - - - `; - }).join('')} - -
TicketTypeModérateurDateStatusAction
${typeEmojis[ticket.type] || '🎫'} ${ticket.ticketId}${ticket.type}${moderatorDisplay}${date}${ticket.status}${ticket.transcriptPath ? `Voir` : 'N/A'}
-
- ` : '
Aucun transcript disponible.
'} -
-
- -`; -} - -// Démarrer le serveur app.listen(PORT, () => { - console.log(`🌐 Serveur de transcripts démarré sur le port ${PORT}`); - console.log(`🔗 URL: http://localhost:${PORT}`); - console.log(`📝 Login: http://localhost:${PORT}/login`); -}); + console.log(`🌐 Serveur de transcripts démarré sur le port ${PORT}`); + console.log('--- STRUCTURE DES FICHIERS ---'); + printTree(path.join(__dirname, 'public'), 'server/public'); + printTree(path.join(process.cwd(), 'transcripts'), 'transcripts'); + console.log('------------------------------'); +}); \ No newline at end of file diff --git a/transcripts/transcript.css b/transcripts/transcript.css index 0c798fa..d568ece 100644 --- a/transcripts/transcript.css +++ b/transcripts/transcript.css @@ -1,255 +1,274 @@ -/* Styles pour les transcripts de tickets */ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); + +:root { + --bg-body: #0f172a; /* Slate 900 */ + --bg-card: #1e293b; /* Slate 800 */ + --bg-element: #334155; /* Slate 700 */ + --text-primary: #f8fafc; /* Slate 50 */ + --text-secondary: #94a3b8;/* Slate 400 */ + --accent: #6366f1; /* Indigo 500 */ + --accent-glow: rgba(99, 102, 241, 0.15); + --border: #475569; /* Slate 600 */ + + --success: #10b981; + --danger: #ef4444; + --warning: #f59e0b; + --info: #3b82f6; +} * { - margin: 0; - padding: 0; - box-sizing: border-box; + margin: 0; + padding: 0; + box-sizing: border-box; } body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - min-height: 100vh; - padding: 20px; - color: #333; + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + background-color: var(--bg-body); + color: var(--text-primary); + line-height: 1.6; + padding: 40px 20px; } .container { - max-width: 1200px; - margin: 0 auto; - background: white; - border-radius: 12px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3); - overflow: hidden; + max-width: 1000px; + margin: 0 auto; + background: var(--bg-card); + border-radius: 16px; + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5); + border: 1px solid var(--border); + overflow: hidden; } +/* --- HEADER --- */ .header { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - color: white; - padding: 30px; - text-align: center; + background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%); + padding: 40px; + text-align: center; + border-bottom: 1px solid var(--border); } .header h1 { - font-size: 2em; - margin-bottom: 10px; + font-size: 2rem; + font-weight: 700; + color: white; + margin-bottom: 8px; + letter-spacing: -0.025em; } .header .ticket-id { - font-size: 1.2em; - opacity: 0.9; + font-family: 'Courier New', monospace; + background: rgba(0, 0, 0, 0.2); + padding: 4px 12px; + border-radius: 999px; + display: inline-block; + font-size: 0.9rem; + color: rgba(255, 255, 255, 0.9); } +/* --- INFO SECTION --- */ .info-section { - padding: 30px; - background: #f8f9fa; + padding: 30px; + background: rgba(15, 23, 42, 0.3); + border-bottom: 1px solid var(--border); } .info-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 15px; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 20px; } .info-item { - background: white; - padding: 15px; - border-radius: 8px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + background: var(--bg-element); + padding: 15px 20px; + border-radius: 12px; + border: 1px solid rgba(255, 255, 255, 0.05); } .info-label { - font-weight: 600; - color: #666; - font-size: 0.9em; - margin-bottom: 5px; + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--text-secondary); + font-weight: 600; + margin-bottom: 6px; } .info-value { - font-size: 1.1em; - color: #333; + font-size: 1rem; + font-weight: 500; + color: var(--text-primary); } .status-badge { - display: inline-block; - padding: 5px 15px; - border-radius: 20px; - font-weight: 600; - font-size: 0.9em; -} - -.status-open { - background: #10b981; - color: white; -} - -.status-closed { - background: #ef4444; - color: white; -} - -.status-pending { - background: #f59e0b; - color: white; + display: inline-block; + padding: 4px 12px; + border-radius: 999px; + font-size: 0.85rem; + font-weight: 600; } +/* --- MESSAGES --- */ .messages-section { - padding: 30px; + padding: 30px; } .messages-section h2 { - margin-bottom: 20px; - color: #333; - font-size: 1.5em; + font-size: 1.25rem; + margin-bottom: 25px; + color: var(--text-primary); + display: flex; + align-items: center; + gap: 10px; +} + +.messages-section h2::before { + content: ''; + display: block; + width: 4px; + height: 24px; + background: var(--accent); + border-radius: 2px; } .message { - background: #f8f9fa; - border-left: 4px solid #667eea; - padding: 15px; - margin-bottom: 15px; - border-radius: 8px; + margin-bottom: 20px; + padding: 15px; + border-radius: 12px; + background: transparent; + border: 1px solid transparent; + transition: background 0.2s; +} + +.message:hover { + background: rgba(255, 255, 255, 0.02); + border-color: rgba(255, 255, 255, 0.05); } .message-header { - display: flex; - justify-content: space-between; - margin-bottom: 10px; - font-size: 0.9em; + display: flex; + align-items: baseline; + gap: 10px; + margin-bottom: 6px; } .message-author { - font-weight: 600; - color: #667eea; + font-weight: 600; + color: var(--accent); + font-size: 1rem; } .message-date { - color: #666; + font-size: 0.75rem; + color: var(--text-secondary); } .message-content { - color: #333; - line-height: 1.6; - white-space: pre-wrap; - word-wrap: break-word; + color: #cbd5e1; + font-size: 0.95rem; + white-space: pre-wrap; + word-wrap: break-word; } +/* Pièces jointes */ .attachments { - margin-top: 10px; - padding-top: 10px; - border-top: 1px solid #dee2e6; - font-size: 0.9em; + margin-top: 10px; + padding: 10px; + background: rgba(0, 0, 0, 0.2); + border-radius: 8px; + font-size: 0.9rem; } .attachments a { - color: #667eea; - text-decoration: none; + color: var(--info); + text-decoration: none; } .attachments a:hover { - text-decoration: underline; + text-decoration: underline; } +/* --- CANDIDATURE --- */ .candidature-section { - padding: 30px; - background: #f8f9fa; - border-top: 2px solid #667eea; + padding: 30px; + background: rgba(99, 102, 241, 0.05); + border-top: 1px solid var(--border); } .candidature-section h2 { - margin-bottom: 20px; - color: #333; - font-size: 1.5em; + color: var(--accent); + margin-bottom: 20px; } .question-item { - background: white; - padding: 20px; - margin-bottom: 15px; - border-radius: 8px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + background: var(--bg-element); + padding: 20px; + border-radius: 12px; + margin-bottom: 15px; + border: 1px solid var(--border); } .question-label { - font-weight: 600; - color: #667eea; - margin-bottom: 10px; - font-size: 1.1em; + color: var(--accent); + font-size: 0.85rem; + font-weight: 700; + text-transform: uppercase; + margin-bottom: 5px; } .question-text { - color: #666; - margin-bottom: 10px; - font-style: italic; -} - -/* Support pour les anciens transcripts avec question-response */ -.question-response { - background: white; - padding: 20px; - margin-bottom: 15px; - border-radius: 8px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); -} - -.question { - margin-bottom: 10px; - color: #667eea; - font-size: 1.1em; + font-weight: 600; + color: var(--text-primary); + margin-bottom: 12px; } .response { - color: #333; - line-height: 1.6; - white-space: pre-wrap; - word-wrap: break-word; - padding: 10px; - background: #f8f9fa; - border-radius: 4px; + background: rgba(0, 0, 0, 0.2); + padding: 15px; + border-radius: 8px; + color: #cbd5e1; + border-left: 3px solid var(--success); +} + +/* --- FOOTER --- */ +.footer { + padding: 20px; + text-align: center; + border-top: 1px solid var(--border); + background: rgba(15, 23, 42, 0.3); + color: var(--text-secondary); + font-size: 0.85rem; } .no-messages { - text-align: center; - color: #666; - font-style: italic; - padding: 40px; + text-align: center; + padding: 40px; + color: var(--text-secondary); + font-style: italic; + background: rgba(255, 255, 255, 0.02); + border-radius: 12px; } -.footer { - background: #f8f9fa; - padding: 20px; - text-align: center; - color: #666; - font-size: 0.9em; - border-top: 1px solid #dee2e6; +/* Scrollbar */ +::-webkit-scrollbar { + width: 8px; +} +::-webkit-scrollbar-track { + background: var(--bg-body); +} +::-webkit-scrollbar-thumb { + background: var(--bg-element); + border-radius: 4px; +} +::-webkit-scrollbar-thumb:hover { + background: var(--border); } -.footer p { - margin: 5px 0; -} - -/* Responsive */ +/* Mobile */ @media (max-width: 768px) { - body { - padding: 10px; - } - - .header { - padding: 20px; - } - - .header h1 { - font-size: 1.5em; - } - - .info-section, - .messages-section, - .candidature-section { - padding: 20px; - } - - .info-grid { - grid-template-columns: 1fr; - } -} - + body { padding: 10px; } + .header { padding: 20px; } + .header h1 { font-size: 1.5rem; } + .info-grid { grid-template-columns: 1fr; } +} \ No newline at end of file diff --git a/utils/helpers.js b/utils/helpers.js index 292dd32..b7c155f 100644 --- a/utils/helpers.js +++ b/utils/helpers.js @@ -98,7 +98,6 @@ module.exports = { parseDuration, formatDuration, formatUptime, - findLogChannel, sendLog, };