"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default")); var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var __decorateClass = (decorators, target, key, kind) => { var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target; for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result; if (kind && result) __defProp(target, key, result); return result; }; // src/index.ts var src_exports = {}; __export(src_exports, { ActionRowBuilder: () => ActionRowBuilder, ApplicationCommandNumericOptionMinMaxValueMixin: () => ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionBase: () => ApplicationCommandOptionBase, ApplicationCommandOptionChannelTypesMixin: () => ApplicationCommandOptionChannelTypesMixin, ApplicationCommandOptionWithAutocompleteMixin: () => ApplicationCommandOptionWithAutocompleteMixin, ApplicationCommandOptionWithChoicesMixin: () => ApplicationCommandOptionWithChoicesMixin, BaseSelectMenuBuilder: () => BaseSelectMenuBuilder, ButtonBuilder: () => ButtonBuilder, ChannelSelectMenuBuilder: () => ChannelSelectMenuBuilder, ComponentAssertions: () => Assertions_exports2, ComponentBuilder: () => ComponentBuilder, ComponentsV2Assertions: () => Assertions_exports4, ContainerBuilder: () => ContainerBuilder, ContextMenuCommandAssertions: () => Assertions_exports7, ContextMenuCommandBuilder: () => ContextMenuCommandBuilder, EmbedAssertions: () => Assertions_exports, EmbedBuilder: () => EmbedBuilder, FileBuilder: () => FileBuilder, MediaGalleryBuilder: () => MediaGalleryBuilder, MediaGalleryItemBuilder: () => MediaGalleryItemBuilder, MentionableSelectMenuBuilder: () => MentionableSelectMenuBuilder, ModalAssertions: () => Assertions_exports5, ModalBuilder: () => ModalBuilder, RoleSelectMenuBuilder: () => RoleSelectMenuBuilder, SectionBuilder: () => SectionBuilder, SelectMenuBuilder: () => StringSelectMenuBuilder, SelectMenuOptionBuilder: () => StringSelectMenuOptionBuilder, SeparatorBuilder: () => SeparatorBuilder, SharedNameAndDescription: () => SharedNameAndDescription, SharedSlashCommand: () => SharedSlashCommand, SharedSlashCommandOptions: () => SharedSlashCommandOptions, SharedSlashCommandSubcommands: () => SharedSlashCommandSubcommands, SlashCommandAssertions: () => Assertions_exports6, SlashCommandAttachmentOption: () => SlashCommandAttachmentOption, SlashCommandBooleanOption: () => SlashCommandBooleanOption, SlashCommandBuilder: () => SlashCommandBuilder, SlashCommandChannelOption: () => SlashCommandChannelOption, SlashCommandIntegerOption: () => SlashCommandIntegerOption, SlashCommandMentionableOption: () => SlashCommandMentionableOption, SlashCommandNumberOption: () => SlashCommandNumberOption, SlashCommandRoleOption: () => SlashCommandRoleOption, SlashCommandStringOption: () => SlashCommandStringOption, SlashCommandSubcommandBuilder: () => SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder: () => SlashCommandSubcommandGroupBuilder, SlashCommandUserOption: () => SlashCommandUserOption, StringSelectMenuBuilder: () => StringSelectMenuBuilder, StringSelectMenuOptionBuilder: () => StringSelectMenuOptionBuilder, TextDisplayBuilder: () => TextDisplayBuilder, TextInputAssertions: () => Assertions_exports3, TextInputBuilder: () => TextInputBuilder, ThumbnailBuilder: () => ThumbnailBuilder, UserSelectMenuBuilder: () => UserSelectMenuBuilder, createComponentBuilder: () => createComponentBuilder, disableValidators: () => disableValidators, embedLength: () => embedLength, enableValidators: () => enableValidators, isValidationEnabled: () => isValidationEnabled, normalizeArray: () => normalizeArray, resolveBuilder: () => resolveBuilder, version: () => version }); module.exports = __toCommonJS(src_exports); // src/messages/embed/Assertions.ts var Assertions_exports = {}; __export(Assertions_exports, { RGBPredicate: () => RGBPredicate, authorNamePredicate: () => authorNamePredicate, colorPredicate: () => colorPredicate, descriptionPredicate: () => descriptionPredicate, embedAuthorPredicate: () => embedAuthorPredicate, embedFieldPredicate: () => embedFieldPredicate, embedFieldsArrayPredicate: () => embedFieldsArrayPredicate, embedFooterPredicate: () => embedFooterPredicate, fieldInlinePredicate: () => fieldInlinePredicate, fieldLengthPredicate: () => fieldLengthPredicate, fieldNamePredicate: () => fieldNamePredicate, fieldValuePredicate: () => fieldValuePredicate, footerTextPredicate: () => footerTextPredicate, imageURLPredicate: () => imageURLPredicate, timestampPredicate: () => timestampPredicate, titlePredicate: () => titlePredicate, urlPredicate: () => urlPredicate, validateFieldLength: () => validateFieldLength }); var import_shapeshift = require("@sapphire/shapeshift"); // src/util/validation.ts var validate = true; function enableValidators() { return validate = true; } __name(enableValidators, "enableValidators"); function disableValidators() { return validate = false; } __name(disableValidators, "disableValidators"); function isValidationEnabled() { return validate; } __name(isValidationEnabled, "isValidationEnabled"); // src/messages/embed/Assertions.ts var fieldNamePredicate = import_shapeshift.s.string().lengthLessThanOrEqual(256).setValidationEnabled(isValidationEnabled); var fieldValuePredicate = import_shapeshift.s.string().lengthLessThanOrEqual(1024).setValidationEnabled(isValidationEnabled); var fieldInlinePredicate = import_shapeshift.s.boolean().optional(); var embedFieldPredicate = import_shapeshift.s.object({ name: fieldNamePredicate, value: fieldValuePredicate, inline: fieldInlinePredicate }).setValidationEnabled(isValidationEnabled); var embedFieldsArrayPredicate = embedFieldPredicate.array().setValidationEnabled(isValidationEnabled); var fieldLengthPredicate = import_shapeshift.s.number().lessThanOrEqual(25).setValidationEnabled(isValidationEnabled); function validateFieldLength(amountAdding, fields) { fieldLengthPredicate.parse((fields?.length ?? 0) + amountAdding); } __name(validateFieldLength, "validateFieldLength"); var authorNamePredicate = fieldNamePredicate.lengthGreaterThanOrEqual(1).nullable().setValidationEnabled(isValidationEnabled); var imageURLPredicate = import_shapeshift.s.string().url({ allowedProtocols: ["http:", "https:", "attachment:"] }).nullish().setValidationEnabled(isValidationEnabled); var urlPredicate = import_shapeshift.s.string().url({ allowedProtocols: ["http:", "https:"] }).nullish().setValidationEnabled(isValidationEnabled); var embedAuthorPredicate = import_shapeshift.s.object({ name: authorNamePredicate, iconURL: imageURLPredicate, url: urlPredicate }).setValidationEnabled(isValidationEnabled); var RGBPredicate = import_shapeshift.s.number().int().greaterThanOrEqual(0).lessThanOrEqual(255).setValidationEnabled(isValidationEnabled); var colorPredicate = import_shapeshift.s.number().int().greaterThanOrEqual(0).lessThanOrEqual(16777215).or(import_shapeshift.s.tuple([RGBPredicate, RGBPredicate, RGBPredicate])).nullable().setValidationEnabled(isValidationEnabled); var descriptionPredicate = import_shapeshift.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(4096).nullable().setValidationEnabled(isValidationEnabled); var footerTextPredicate = import_shapeshift.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(2048).nullable().setValidationEnabled(isValidationEnabled); var embedFooterPredicate = import_shapeshift.s.object({ text: footerTextPredicate, iconURL: imageURLPredicate }).setValidationEnabled(isValidationEnabled); var timestampPredicate = import_shapeshift.s.union([import_shapeshift.s.number(), import_shapeshift.s.date()]).nullable().setValidationEnabled(isValidationEnabled); var titlePredicate = fieldNamePredicate.lengthGreaterThanOrEqual(1).nullable().setValidationEnabled(isValidationEnabled); // src/util/normalizeArray.ts function normalizeArray(arr) { if (Array.isArray(arr[0])) return [...arr[0]]; return arr; } __name(normalizeArray, "normalizeArray"); // src/messages/embed/Embed.ts var EmbedBuilder = class { static { __name(this, "EmbedBuilder"); } /** * The API data associated with this embed. */ data; /** * Creates a new embed from API data. * * @param data - The API data to create this embed with */ constructor(data = {}) { this.data = { ...data }; if (data.timestamp) this.data.timestamp = new Date(data.timestamp).toISOString(); } /** * Appends fields to the embed. * * @remarks * This method accepts either an array of fields or a variable number of field parameters. * The maximum amount of fields that can be added is 25. * @example * Using an array: * ```ts * const fields: APIEmbedField[] = ...; * const embed = new EmbedBuilder() * .addFields(fields); * ``` * @example * Using rest parameters (variadic): * ```ts * const embed = new EmbedBuilder() * .addFields( * { name: 'Field 1', value: 'Value 1' }, * { name: 'Field 2', value: 'Value 2' }, * ); * ``` * @param fields - The fields to add */ addFields(...fields) { const normalizedFields = normalizeArray(fields); validateFieldLength(normalizedFields.length, this.data.fields); embedFieldsArrayPredicate.parse(normalizedFields); if (this.data.fields) this.data.fields.push(...normalizedFields); else this.data.fields = normalizedFields; return this; } /** * Removes, replaces, or inserts fields for this embed. * * @remarks * This method behaves similarly * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}. * The maximum amount of fields that can be added is 25. * * It's useful for modifying and adjusting order of the already-existing fields of an embed. * @example * Remove the first field: * ```ts * embed.spliceFields(0, 1); * ``` * @example * Remove the first n fields: * ```ts * const n = 4; * embed.spliceFields(0, n); * ``` * @example * Remove the last field: * ```ts * embed.spliceFields(-1, 1); * ``` * @param index - The index to start at * @param deleteCount - The number of fields to remove * @param fields - The replacing field objects */ spliceFields(index, deleteCount, ...fields) { validateFieldLength(fields.length - deleteCount, this.data.fields); embedFieldsArrayPredicate.parse(fields); if (this.data.fields) this.data.fields.splice(index, deleteCount, ...fields); else this.data.fields = fields; return this; } /** * Sets the fields for this embed. * * @remarks * This method is an alias for {@link EmbedBuilder.spliceFields}. More specifically, * it splices the entire array of fields, replacing them with the provided fields. * * You can set a maximum of 25 fields. * @param fields - The fields to set */ setFields(...fields) { this.spliceFields(0, this.data.fields?.length ?? 0, ...normalizeArray(fields)); return this; } /** * Sets the author of this embed. * * @param options - The options to use */ setAuthor(options) { if (options === null) { this.data.author = void 0; return this; } embedAuthorPredicate.parse(options); this.data.author = { name: options.name, url: options.url, icon_url: options.iconURL }; return this; } /** * Sets the color of this embed. * * @param color - The color to use */ setColor(color) { colorPredicate.parse(color); if (Array.isArray(color)) { const [red, green, blue] = color; this.data.color = (red << 16) + (green << 8) + blue; return this; } this.data.color = color ?? void 0; return this; } /** * Sets the description of this embed. * * @param description - The description to use */ setDescription(description) { descriptionPredicate.parse(description); this.data.description = description ?? void 0; return this; } /** * Sets the footer of this embed. * * @param options - The footer to use */ setFooter(options) { if (options === null) { this.data.footer = void 0; return this; } embedFooterPredicate.parse(options); this.data.footer = { text: options.text, icon_url: options.iconURL }; return this; } /** * Sets the image of this embed. * * @param url - The image URL to use */ setImage(url) { imageURLPredicate.parse(url); this.data.image = url ? { url } : void 0; return this; } /** * Sets the thumbnail of this embed. * * @param url - The thumbnail URL to use */ setThumbnail(url) { imageURLPredicate.parse(url); this.data.thumbnail = url ? { url } : void 0; return this; } /** * Sets the timestamp of this embed. * * @param timestamp - The timestamp or date to use */ setTimestamp(timestamp = Date.now()) { timestampPredicate.parse(timestamp); this.data.timestamp = timestamp ? new Date(timestamp).toISOString() : void 0; return this; } /** * Sets the title for this embed. * * @param title - The title to use */ setTitle(title) { titlePredicate.parse(title); this.data.title = title ?? void 0; return this; } /** * Sets the URL of this embed. * * @param url - The URL to use */ setURL(url) { urlPredicate.parse(url); this.data.url = url ?? void 0; return this; } /** * Serializes this builder to API-compatible JSON data. * * @remarks * This method runs validations on the data before serializing it. * As such, it may throw an error if the data is invalid. */ toJSON() { return { ...this.data }; } }; // src/index.ts __reExport(src_exports, require("@discordjs/formatters"), module.exports); // src/components/Assertions.ts var Assertions_exports2 = {}; __export(Assertions_exports2, { buttonLabelValidator: () => buttonLabelValidator, buttonStyleValidator: () => buttonStyleValidator, channelTypesValidator: () => channelTypesValidator, customIdValidator: () => customIdValidator, defaultValidator: () => defaultValidator, disabledValidator: () => disabledValidator, emojiValidator: () => emojiValidator, idValidator: () => idValidator, jsonOptionValidator: () => jsonOptionValidator, labelValueDescriptionValidator: () => labelValueDescriptionValidator, minMaxValidator: () => minMaxValidator, optionValidator: () => optionValidator, optionsLengthValidator: () => optionsLengthValidator, optionsValidator: () => optionsValidator, placeholderValidator: () => placeholderValidator, urlValidator: () => urlValidator, validateRequiredButtonParameters: () => validateRequiredButtonParameters, validateRequiredSelectMenuOptionParameters: () => validateRequiredSelectMenuOptionParameters, validateRequiredSelectMenuParameters: () => validateRequiredSelectMenuParameters }); var import_shapeshift2 = require("@sapphire/shapeshift"); var import_v10 = require("discord-api-types/v10"); // src/components/selectMenu/StringSelectMenuOption.ts var StringSelectMenuOptionBuilder = class { /** * Creates a new string select menu option from API data. * * @param data - The API data to create this string select menu option with * @example * Creating a string select menu option from an API data object: * ```ts * const selectMenuOption = new SelectMenuOptionBuilder({ * label: 'catchy label', * value: '1', * }); * ``` * @example * Creating a string select menu option using setters and API data: * ```ts * const selectMenuOption = new SelectMenuOptionBuilder({ * default: true, * value: '1', * }) * .setLabel('woah'); * ``` */ constructor(data = {}) { this.data = data; } static { __name(this, "StringSelectMenuOptionBuilder"); } /** * Sets the label for this option. * * @param label - The label to use */ setLabel(label) { this.data.label = labelValueDescriptionValidator.parse(label); return this; } /** * Sets the value for this option. * * @param value - The value to use */ setValue(value) { this.data.value = labelValueDescriptionValidator.parse(value); return this; } /** * Sets the description for this option. * * @param description - The description to use */ setDescription(description) { this.data.description = labelValueDescriptionValidator.parse(description); return this; } /** * Sets whether this option is selected by default. * * @param isDefault - Whether this option is selected by default */ setDefault(isDefault = true) { this.data.default = defaultValidator.parse(isDefault); return this; } /** * Sets the emoji to display for this option. * * @param emoji - The emoji to use */ setEmoji(emoji) { this.data.emoji = emojiValidator.parse(emoji); return this; } /** * {@inheritDoc BaseSelectMenuBuilder.toJSON} */ toJSON() { validateRequiredSelectMenuOptionParameters(this.data.label, this.data.value); return { ...this.data }; } }; // src/components/Assertions.ts var idValidator = import_shapeshift2.s.number().safeInt().greaterThanOrEqual(1).lessThan(4294967296).setValidationEnabled(isValidationEnabled); var customIdValidator = import_shapeshift2.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled); var emojiValidator = import_shapeshift2.s.object({ id: import_shapeshift2.s.string(), name: import_shapeshift2.s.string(), animated: import_shapeshift2.s.boolean() }).partial().strict().setValidationEnabled(isValidationEnabled); var disabledValidator = import_shapeshift2.s.boolean(); var buttonLabelValidator = import_shapeshift2.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(80).setValidationEnabled(isValidationEnabled); var buttonStyleValidator = import_shapeshift2.s.nativeEnum(import_v10.ButtonStyle); var placeholderValidator = import_shapeshift2.s.string().lengthLessThanOrEqual(150).setValidationEnabled(isValidationEnabled); var minMaxValidator = import_shapeshift2.s.number().int().greaterThanOrEqual(0).lessThanOrEqual(25).setValidationEnabled(isValidationEnabled); var labelValueDescriptionValidator = import_shapeshift2.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled); var jsonOptionValidator = import_shapeshift2.s.object({ label: labelValueDescriptionValidator, value: labelValueDescriptionValidator, description: labelValueDescriptionValidator.optional(), emoji: emojiValidator.optional(), default: import_shapeshift2.s.boolean().optional() }).setValidationEnabled(isValidationEnabled); var optionValidator = import_shapeshift2.s.instance(StringSelectMenuOptionBuilder).setValidationEnabled(isValidationEnabled); var optionsValidator = optionValidator.array().lengthGreaterThanOrEqual(0).setValidationEnabled(isValidationEnabled); var optionsLengthValidator = import_shapeshift2.s.number().int().greaterThanOrEqual(0).lessThanOrEqual(25).setValidationEnabled(isValidationEnabled); function validateRequiredSelectMenuParameters(options, customId) { customIdValidator.parse(customId); optionsValidator.parse(options); } __name(validateRequiredSelectMenuParameters, "validateRequiredSelectMenuParameters"); var defaultValidator = import_shapeshift2.s.boolean(); function validateRequiredSelectMenuOptionParameters(label, value) { labelValueDescriptionValidator.parse(label); labelValueDescriptionValidator.parse(value); } __name(validateRequiredSelectMenuOptionParameters, "validateRequiredSelectMenuOptionParameters"); var channelTypesValidator = import_shapeshift2.s.nativeEnum(import_v10.ChannelType).array().setValidationEnabled(isValidationEnabled); var urlValidator = import_shapeshift2.s.string().url({ allowedProtocols: ["http:", "https:", "discord:"] }).setValidationEnabled(isValidationEnabled); function validateRequiredButtonParameters(style, label, emoji, customId, skuId, url) { if (style === import_v10.ButtonStyle.Premium) { if (!skuId) { throw new RangeError("Premium buttons must have an SKU id."); } if (customId || label || url || emoji) { throw new RangeError("Premium buttons cannot have a custom id, label, URL, or emoji."); } } else { if (skuId) { throw new RangeError("Non-premium buttons must not have an SKU id."); } if (url && customId) { throw new RangeError("URL and custom id are mutually exclusive."); } if (!label && !emoji) { throw new RangeError("Non-premium buttons must have a label and/or an emoji."); } if (style === import_v10.ButtonStyle.Link) { if (!url) { throw new RangeError("Link buttons must have a URL."); } } else if (url) { throw new RangeError("Non-premium and non-link buttons cannot have a URL."); } } } __name(validateRequiredButtonParameters, "validateRequiredButtonParameters"); // src/components/ActionRow.ts var import_v1019 = require("discord-api-types/v10"); // src/components/Component.ts var ComponentBuilder = class { static { __name(this, "ComponentBuilder"); } /** * The API data associated with this component. */ data; /** * Constructs a new kind of component. * * @param data - The data to construct a component out of */ constructor(data) { this.data = data; } /** * Sets the id (not the custom id) for this component. * * @param id - The id for this component */ setId(id) { this.data.id = idValidator.parse(id); return this; } /** * Clears the id of this component, defaulting to a default incremented id. */ clearId() { this.data.id = void 0; return this; } }; // src/components/Components.ts var import_v1018 = require("discord-api-types/v10"); // src/components/button/Button.ts var import_v102 = require("discord-api-types/v10"); var ButtonBuilder = class extends ComponentBuilder { static { __name(this, "ButtonBuilder"); } /** * Creates a new button from API data. * * @param data - The API data to create this button with * @example * Creating a button from an API data object: * ```ts * const button = new ButtonBuilder({ * custom_id: 'a cool button', * style: ButtonStyle.Primary, * label: 'Click Me', * emoji: { * name: 'smile', * id: '123456789012345678', * }, * }); * ``` * @example * Creating a button using setters and API data: * ```ts * const button = new ButtonBuilder({ * style: ButtonStyle.Secondary, * label: 'Click Me', * }) * .setEmoji({ name: '🙂' }) * .setCustomId('another cool button'); * ``` */ constructor(data) { super({ type: import_v102.ComponentType.Button, ...data }); } /** * Sets the style of this button. * * @param style - The style to use */ setStyle(style) { this.data.style = buttonStyleValidator.parse(style); return this; } /** * Sets the URL for this button. * * @remarks * This method is only available to buttons using the `Link` button style. * Only three types of URL schemes are currently supported: `https://`, `http://`, and `discord://`. * @param url - The URL to use */ setURL(url) { this.data.url = urlValidator.parse(url); return this; } /** * Sets the custom id for this button. * * @remarks * This method is only applicable to buttons that are not using the `Link` button style. * @param customId - The custom id to use */ setCustomId(customId) { this.data.custom_id = customIdValidator.parse(customId); return this; } /** * Sets the SKU id that represents a purchasable SKU for this button. * * @remarks Only available when using premium-style buttons. * @param skuId - The SKU id to use */ setSKUId(skuId) { this.data.sku_id = skuId; return this; } /** * Sets the emoji to display on this button. * * @param emoji - The emoji to use */ setEmoji(emoji) { this.data.emoji = emojiValidator.parse(emoji); return this; } /** * Sets whether this button is disabled. * * @param disabled - Whether to disable this button */ setDisabled(disabled = true) { this.data.disabled = disabledValidator.parse(disabled); return this; } /** * Sets the label for this button. * * @param label - The label to use */ setLabel(label) { this.data.label = buttonLabelValidator.parse(label); return this; } /** * {@inheritDoc ComponentBuilder.toJSON} */ toJSON() { validateRequiredButtonParameters( this.data.style, this.data.label, this.data.emoji, this.data.custom_id, this.data.sku_id, this.data.url ); return { ...this.data }; } }; // src/components/selectMenu/ChannelSelectMenu.ts var import_v103 = require("discord-api-types/v10"); // src/components/selectMenu/BaseSelectMenu.ts var BaseSelectMenuBuilder = class extends ComponentBuilder { static { __name(this, "BaseSelectMenuBuilder"); } /** * Sets the placeholder for this select menu. * * @param placeholder - The placeholder to use */ setPlaceholder(placeholder) { this.data.placeholder = placeholderValidator.parse(placeholder); return this; } /** * Sets the minimum values that must be selected in the select menu. * * @param minValues - The minimum values that must be selected */ setMinValues(minValues) { this.data.min_values = minMaxValidator.parse(minValues); return this; } /** * Sets the maximum values that must be selected in the select menu. * * @param maxValues - The maximum values that must be selected */ setMaxValues(maxValues) { this.data.max_values = minMaxValidator.parse(maxValues); return this; } /** * Sets the custom id for this select menu. * * @param customId - The custom id to use */ setCustomId(customId) { this.data.custom_id = customIdValidator.parse(customId); return this; } /** * Sets whether this select menu is disabled. * * @param disabled - Whether this select menu is disabled */ setDisabled(disabled = true) { this.data.disabled = disabledValidator.parse(disabled); return this; } /** * {@inheritDoc ComponentBuilder.toJSON} */ toJSON() { customIdValidator.parse(this.data.custom_id); return { ...this.data }; } }; // src/components/selectMenu/ChannelSelectMenu.ts var ChannelSelectMenuBuilder = class extends BaseSelectMenuBuilder { static { __name(this, "ChannelSelectMenuBuilder"); } /** * Creates a new select menu from API data. * * @param data - The API data to create this select menu with * @example * Creating a select menu from an API data object: * ```ts * const selectMenu = new ChannelSelectMenuBuilder({ * custom_id: 'a cool select menu', * placeholder: 'select an option', * max_values: 2, * }); * ``` * @example * Creating a select menu using setters and API data: * ```ts * const selectMenu = new ChannelSelectMenuBuilder({ * custom_id: 'a cool select menu', * }) * .addChannelTypes(ChannelType.GuildText, ChannelType.GuildAnnouncement) * .setMinValues(2); * ``` */ constructor(data) { super({ ...data, type: import_v103.ComponentType.ChannelSelect }); } /** * Adds channel types to this select menu. * * @param types - The channel types to use */ addChannelTypes(...types) { const normalizedTypes = normalizeArray(types); this.data.channel_types ??= []; this.data.channel_types.push(...channelTypesValidator.parse(normalizedTypes)); return this; } /** * Sets channel types for this select menu. * * @param types - The channel types to use */ setChannelTypes(...types) { const normalizedTypes = normalizeArray(types); this.data.channel_types ??= []; this.data.channel_types.splice(0, this.data.channel_types.length, ...channelTypesValidator.parse(normalizedTypes)); return this; } /** * Adds default channels to this auto populated select menu. * * @param channels - The channels to add */ addDefaultChannels(...channels) { const normalizedValues = normalizeArray(channels); optionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length); this.data.default_values ??= []; this.data.default_values.push( ...normalizedValues.map((id) => ({ id, type: import_v103.SelectMenuDefaultValueType.Channel })) ); return this; } /** * Sets default channels for this auto populated select menu. * * @param channels - The channels to set */ setDefaultChannels(...channels) { const normalizedValues = normalizeArray(channels); optionsLengthValidator.parse(normalizedValues.length); this.data.default_values = normalizedValues.map((id) => ({ id, type: import_v103.SelectMenuDefaultValueType.Channel })); return this; } /** * {@inheritDoc BaseSelectMenuBuilder.toJSON} */ toJSON() { customIdValidator.parse(this.data.custom_id); return { ...this.data }; } }; // src/components/selectMenu/MentionableSelectMenu.ts var import_v104 = require("discord-api-types/v10"); var MentionableSelectMenuBuilder = class extends BaseSelectMenuBuilder { static { __name(this, "MentionableSelectMenuBuilder"); } /** * Creates a new select menu from API data. * * @param data - The API data to create this select menu with * @example * Creating a select menu from an API data object: * ```ts * const selectMenu = new MentionableSelectMenuBuilder({ * custom_id: 'a cool select menu', * placeholder: 'select an option', * max_values: 2, * }); * ``` * @example * Creating a select menu using setters and API data: * ```ts * const selectMenu = new MentionableSelectMenuBuilder({ * custom_id: 'a cool select menu', * }) * .setMinValues(1); * ``` */ constructor(data) { super({ ...data, type: import_v104.ComponentType.MentionableSelect }); } /** * Adds default roles to this auto populated select menu. * * @param roles - The roles to add */ addDefaultRoles(...roles) { const normalizedValues = normalizeArray(roles); optionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length); this.data.default_values ??= []; this.data.default_values.push( ...normalizedValues.map((id) => ({ id, type: import_v104.SelectMenuDefaultValueType.Role })) ); return this; } /** * Adds default users to this auto populated select menu. * * @param users - The users to add */ addDefaultUsers(...users) { const normalizedValues = normalizeArray(users); optionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length); this.data.default_values ??= []; this.data.default_values.push( ...normalizedValues.map((id) => ({ id, type: import_v104.SelectMenuDefaultValueType.User })) ); return this; } /** * Adds default values to this auto populated select menu. * * @param values - The values to add */ addDefaultValues(...values) { const normalizedValues = normalizeArray(values); optionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length); this.data.default_values ??= []; this.data.default_values.push(...normalizedValues); return this; } /** * Sets default values for this auto populated select menu. * * @param values - The values to set */ setDefaultValues(...values) { const normalizedValues = normalizeArray(values); optionsLengthValidator.parse(normalizedValues.length); this.data.default_values = normalizedValues; return this; } }; // src/components/selectMenu/RoleSelectMenu.ts var import_v105 = require("discord-api-types/v10"); var RoleSelectMenuBuilder = class extends BaseSelectMenuBuilder { static { __name(this, "RoleSelectMenuBuilder"); } /** * Creates a new select menu from API data. * * @param data - The API data to create this select menu with * @example * Creating a select menu from an API data object: * ```ts * const selectMenu = new RoleSelectMenuBuilder({ * custom_id: 'a cool select menu', * placeholder: 'select an option', * max_values: 2, * }); * ``` * @example * Creating a select menu using setters and API data: * ```ts * const selectMenu = new RoleSelectMenuBuilder({ * custom_id: 'a cool select menu', * }) * .setMinValues(1); * ``` */ constructor(data) { super({ ...data, type: import_v105.ComponentType.RoleSelect }); } /** * Adds default roles to this auto populated select menu. * * @param roles - The roles to add */ addDefaultRoles(...roles) { const normalizedValues = normalizeArray(roles); optionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length); this.data.default_values ??= []; this.data.default_values.push( ...normalizedValues.map((id) => ({ id, type: import_v105.SelectMenuDefaultValueType.Role })) ); return this; } /** * Sets default roles for this auto populated select menu. * * @param roles - The roles to set */ setDefaultRoles(...roles) { const normalizedValues = normalizeArray(roles); optionsLengthValidator.parse(normalizedValues.length); this.data.default_values = normalizedValues.map((id) => ({ id, type: import_v105.SelectMenuDefaultValueType.Role })); return this; } }; // src/components/selectMenu/StringSelectMenu.ts var import_v106 = require("discord-api-types/v10"); var StringSelectMenuBuilder = class extends BaseSelectMenuBuilder { static { __name(this, "StringSelectMenuBuilder"); } /** * The options within this select menu. */ options; /** * Creates a new select menu from API data. * * @param data - The API data to create this select menu with * @example * Creating a select menu from an API data object: * ```ts * const selectMenu = new StringSelectMenuBuilder({ * custom_id: 'a cool select menu', * placeholder: 'select an option', * max_values: 2, * options: [ * { label: 'option 1', value: '1' }, * { label: 'option 2', value: '2' }, * { label: 'option 3', value: '3' }, * ], * }); * ``` * @example * Creating a select menu using setters and API data: * ```ts * const selectMenu = new StringSelectMenuBuilder({ * custom_id: 'a cool select menu', * }) * .setMinValues(1) * .addOptions({ * label: 'Catchy', * value: 'catch', * }); * ``` */ constructor(data) { const { options, ...initData } = data ?? {}; super({ ...initData, type: import_v106.ComponentType.StringSelect }); this.options = options?.map((option) => new StringSelectMenuOptionBuilder(option)) ?? []; } /** * Adds options to this select menu. * * @param options - The options to add */ addOptions(...options) { const normalizedOptions = normalizeArray(options); optionsLengthValidator.parse(this.options.length + normalizedOptions.length); this.options.push( ...normalizedOptions.map( (normalizedOption) => normalizedOption instanceof StringSelectMenuOptionBuilder ? normalizedOption : new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(normalizedOption)) ) ); return this; } /** * Sets the options for this select menu. * * @param options - The options to set */ setOptions(...options) { return this.spliceOptions(0, this.options.length, ...options); } /** * Removes, replaces, or inserts options for this select menu. * * @remarks * This method behaves similarly * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | Array.prototype.splice()}. * It's useful for modifying and adjusting the order of existing options. * @example * Remove the first option: * ```ts * selectMenu.spliceOptions(0, 1); * ``` * @example * Remove the first n option: * ```ts * const n = 4; * selectMenu.spliceOptions(0, n); * ``` * @example * Remove the last option: * ```ts * selectMenu.spliceOptions(-1, 1); * ``` * @param index - The index to start at * @param deleteCount - The number of options to remove * @param options - The replacing option objects or builders */ spliceOptions(index, deleteCount, ...options) { const normalizedOptions = normalizeArray(options); const clone = [...this.options]; clone.splice( index, deleteCount, ...normalizedOptions.map( (normalizedOption) => normalizedOption instanceof StringSelectMenuOptionBuilder ? normalizedOption : new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(normalizedOption)) ) ); optionsLengthValidator.parse(clone.length); this.options.splice(0, this.options.length, ...clone); return this; } /** * {@inheritDoc BaseSelectMenuBuilder.toJSON} */ toJSON() { validateRequiredSelectMenuParameters(this.options, this.data.custom_id); return { ...this.data, options: this.options.map((option) => option.toJSON()) }; } }; // src/components/selectMenu/UserSelectMenu.ts var import_v107 = require("discord-api-types/v10"); var UserSelectMenuBuilder = class extends BaseSelectMenuBuilder { static { __name(this, "UserSelectMenuBuilder"); } /** * Creates a new select menu from API data. * * @param data - The API data to create this select menu with * @example * Creating a select menu from an API data object: * ```ts * const selectMenu = new UserSelectMenuBuilder({ * custom_id: 'a cool select menu', * placeholder: 'select an option', * max_values: 2, * }); * ``` * @example * Creating a select menu using setters and API data: * ```ts * const selectMenu = new UserSelectMenuBuilder({ * custom_id: 'a cool select menu', * }) * .setMinValues(1); * ``` */ constructor(data) { super({ ...data, type: import_v107.ComponentType.UserSelect }); } /** * Adds default users to this auto populated select menu. * * @param users - The users to add */ addDefaultUsers(...users) { const normalizedValues = normalizeArray(users); optionsLengthValidator.parse((this.data.default_values?.length ?? 0) + normalizedValues.length); this.data.default_values ??= []; this.data.default_values.push( ...normalizedValues.map((id) => ({ id, type: import_v107.SelectMenuDefaultValueType.User })) ); return this; } /** * Sets default users for this auto populated select menu. * * @param users - The users to set */ setDefaultUsers(...users) { const normalizedValues = normalizeArray(users); optionsLengthValidator.parse(normalizedValues.length); this.data.default_values = normalizedValues.map((id) => ({ id, type: import_v107.SelectMenuDefaultValueType.User })); return this; } }; // src/components/textInput/TextInput.ts var import_util = require("@discordjs/util"); var import_v109 = require("discord-api-types/v10"); var import_fast_deep_equal = __toESM(require("fast-deep-equal")); // src/components/textInput/Assertions.ts var Assertions_exports3 = {}; __export(Assertions_exports3, { labelValidator: () => labelValidator, maxLengthValidator: () => maxLengthValidator, minLengthValidator: () => minLengthValidator, placeholderValidator: () => placeholderValidator2, requiredValidator: () => requiredValidator, textInputStyleValidator: () => textInputStyleValidator, validateRequiredParameters: () => validateRequiredParameters, valueValidator: () => valueValidator }); var import_shapeshift3 = require("@sapphire/shapeshift"); var import_v108 = require("discord-api-types/v10"); var textInputStyleValidator = import_shapeshift3.s.nativeEnum(import_v108.TextInputStyle); var minLengthValidator = import_shapeshift3.s.number().int().greaterThanOrEqual(0).lessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled); var maxLengthValidator = import_shapeshift3.s.number().int().greaterThanOrEqual(1).lessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled); var requiredValidator = import_shapeshift3.s.boolean(); var valueValidator = import_shapeshift3.s.string().lengthLessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled); var placeholderValidator2 = import_shapeshift3.s.string().lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled); var labelValidator = import_shapeshift3.s.string().lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45).setValidationEnabled(isValidationEnabled); function validateRequiredParameters(customId, style, label) { customIdValidator.parse(customId); textInputStyleValidator.parse(style); labelValidator.parse(label); } __name(validateRequiredParameters, "validateRequiredParameters"); // src/components/textInput/TextInput.ts var TextInputBuilder = class extends ComponentBuilder { static { __name(this, "TextInputBuilder"); } /** * Creates a new text input from API data. * * @param data - The API data to create this text input with * @example * Creating a text input from an API data object: * ```ts * const textInput = new TextInputBuilder({ * custom_id: 'a cool text input', * label: 'Type something', * style: TextInputStyle.Short, * }); * ``` * @example * Creating a text input using setters and API data: * ```ts * const textInput = new TextInputBuilder({ * label: 'Type something else', * }) * .setCustomId('woah') * .setStyle(TextInputStyle.Paragraph); * ``` */ constructor(data) { super({ type: import_v109.ComponentType.TextInput, ...data }); } /** * Sets the custom id for this text input. * * @param customId - The custom id to use */ setCustomId(customId) { this.data.custom_id = customIdValidator.parse(customId); return this; } /** * Sets the label for this text input. * * @param label - The label to use */ setLabel(label) { this.data.label = labelValidator.parse(label); return this; } /** * Sets the style for this text input. * * @param style - The style to use */ setStyle(style) { this.data.style = textInputStyleValidator.parse(style); return this; } /** * Sets the minimum length of text for this text input. * * @param minLength - The minimum length of text for this text input */ setMinLength(minLength) { this.data.min_length = minLengthValidator.parse(minLength); return this; } /** * Sets the maximum length of text for this text input. * * @param maxLength - The maximum length of text for this text input */ setMaxLength(maxLength) { this.data.max_length = maxLengthValidator.parse(maxLength); return this; } /** * Sets the placeholder for this text input. * * @param placeholder - The placeholder to use */ setPlaceholder(placeholder) { this.data.placeholder = placeholderValidator2.parse(placeholder); return this; } /** * Sets the value for this text input. * * @param value - The value to use */ setValue(value) { this.data.value = valueValidator.parse(value); return this; } /** * Sets whether this text input is required. * * @param required - Whether this text input is required */ setRequired(required = true) { this.data.required = requiredValidator.parse(required); return this; } /** * {@inheritDoc ComponentBuilder.toJSON} */ toJSON() { validateRequiredParameters(this.data.custom_id, this.data.style, this.data.label); return { ...this.data }; } /** * Whether this is equal to another structure. */ equals(other) { if ((0, import_util.isJSONEncodable)(other)) { return (0, import_fast_deep_equal.default)(other.toJSON(), this.data); } return (0, import_fast_deep_equal.default)(other, this.data); } }; // src/components/v2/Container.ts var import_v1015 = require("discord-api-types/v10"); // src/components/v2/Assertions.ts var Assertions_exports4 = {}; __export(Assertions_exports4, { accessoryPredicate: () => accessoryPredicate, assertReturnOfBuilder: () => assertReturnOfBuilder, containerColorPredicate: () => containerColorPredicate, descriptionPredicate: () => descriptionPredicate2, dividerPredicate: () => dividerPredicate, filePredicate: () => filePredicate, spacingPredicate: () => spacingPredicate, spoilerPredicate: () => spoilerPredicate, textDisplayContentPredicate: () => textDisplayContentPredicate, unfurledMediaItemPredicate: () => unfurledMediaItemPredicate, validateComponentArray: () => validateComponentArray }); var import_shapeshift4 = require("@sapphire/shapeshift"); var import_v1011 = require("discord-api-types/v10"); // src/components/v2/Thumbnail.ts var import_v1010 = require("discord-api-types/v10"); var ThumbnailBuilder = class extends ComponentBuilder { static { __name(this, "ThumbnailBuilder"); } /** * Creates a new thumbnail from API data. * * @param data - The API data to create this thumbnail with * @example * Creating a thumbnail from an API data object: * ```ts * const thumbnail = new ThumbnailBuilder({ * description: 'some text', * media: { * url: 'https://cdn.discordapp.com/embed/avatars/4.png', * }, * }); * ``` * @example * Creating a thumbnail using setters and API data: * ```ts * const thumbnail = new ThumbnailBuilder({ * media: { * url: 'attachment://image.png', * }, * }) * .setDescription('alt text'); * ``` */ constructor(data = {}) { super({ type: import_v1010.ComponentType.Thumbnail, ...data, media: data.media ? { url: data.media.url } : void 0 }); } /** * Sets the description of this thumbnail. * * @param description - The description to use */ setDescription(description) { this.data.description = descriptionPredicate2.parse(description); return this; } /** * Clears the description of this thumbnail. */ clearDescription() { this.data.description = void 0; return this; } /** * Sets the spoiler status of this thumbnail. * * @param spoiler - The spoiler status to use */ setSpoiler(spoiler = true) { this.data.spoiler = spoilerPredicate.parse(spoiler); return this; } /** * Sets the media URL of this thumbnail. * * @param url - The URL to use */ setURL(url) { this.data.media = unfurledMediaItemPredicate.parse({ url }); return this; } /** * {@inheritdoc ComponentBuilder.toJSON} */ toJSON() { unfurledMediaItemPredicate.parse(this.data.media); return { ...this.data }; } }; // src/components/v2/Assertions.ts var unfurledMediaItemPredicate = import_shapeshift4.s.object({ url: import_shapeshift4.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:" }) }).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 containerColorPredicate = colorPredicate.nullish(); function assertReturnOfBuilder(input, ExpectedInstanceOf) { import_shapeshift4.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); } __name(validateComponentArray, "validateComponentArray"); // src/components/v2/File.ts var import_v1012 = require("discord-api-types/v10"); var FileBuilder = class extends ComponentBuilder { static { __name(this, "FileBuilder"); } /** * Creates a new file from API data. * * @param data - The API data to create this file with * @example * Creating a file from an API data object: * ```ts * const file = new FileBuilder({ * spoiler: true, * file: { * url: 'attachment://file.png', * }, * }); * ``` * @example * Creating a file using setters and API data: * ```ts * const file = new FileBuilder({ * file: { * url: 'attachment://image.jpg', * }, * }) * .setSpoiler(false); * ``` */ constructor(data = {}) { super({ type: import_v1012.ComponentType.File, ...data, file: data.file ? { url: data.file.url } : void 0 }); } /** * Sets the spoiler status of this file. * * @param spoiler - The spoiler status to use */ setSpoiler(spoiler = true) { this.data.spoiler = spoilerPredicate.parse(spoiler); return this; } /** * Sets the media URL of this file. * * @param url - The URL to use */ setURL(url) { this.data.file = filePredicate.parse({ url }); return this; } /** * {@inheritDoc ComponentBuilder.toJSON} */ toJSON() { filePredicate.parse(this.data.file); return { ...this.data, file: { ...this.data.file } }; } }; // src/components/v2/Separator.ts var import_v1013 = require("discord-api-types/v10"); var SeparatorBuilder = class extends ComponentBuilder { static { __name(this, "SeparatorBuilder"); } /** * Creates a new separator from API data. * * @param data - The API data to create this separator with * @example * Creating a separator from an API data object: * ```ts * const separator = new SeparatorBuilder({ * spacing: SeparatorSpacingSize.Small, * divider: true, * }); * ``` * @example * Creating a separator using setters and API data: * ```ts * const separator = new SeparatorBuilder({ * spacing: SeparatorSpacingSize.Large, * }) * .setDivider(false); * ``` */ constructor(data = {}) { super({ type: import_v1013.ComponentType.Separator, ...data }); } /** * Sets whether this separator should show a divider line. * * @param divider - Whether to show a divider line */ setDivider(divider = true) { this.data.divider = dividerPredicate.parse(divider); return this; } /** * Sets the spacing of this separator. * * @param spacing - The spacing to use */ setSpacing(spacing) { this.data.spacing = spacingPredicate.parse(spacing); return this; } /** * Clears the spacing of this separator. */ clearSpacing() { this.data.spacing = void 0; return this; } /** * {@inheritDoc ComponentBuilder.toJSON} */ toJSON() { return { ...this.data }; } }; // src/components/v2/TextDisplay.ts var import_v1014 = require("discord-api-types/v10"); var TextDisplayBuilder = class extends ComponentBuilder { static { __name(this, "TextDisplayBuilder"); } /** * Creates a new text display from API data. * * @param data - The API data to create this text display with * @example * Creating a text display from an API data object: * ```ts * const textDisplay = new TextDisplayBuilder({ * content: 'some text', * }); * ``` * @example * Creating a text display using setters and API data: * ```ts * const textDisplay = new TextDisplayBuilder({ * content: 'old text', * }) * .setContent('new text'); * ``` */ constructor(data = {}) { super({ type: import_v1014.ComponentType.TextDisplay, ...data }); } /** * Sets the text of this text display. * * @param content - The text to use */ setContent(content) { this.data.content = textDisplayContentPredicate.parse(content); return this; } /** * {@inheritDoc ComponentBuilder.toJSON} */ toJSON() { textDisplayContentPredicate.parse(this.data.content); return { ...this.data }; } }; // src/components/v2/Container.ts var ContainerBuilder = class extends ComponentBuilder { static { __name(this, "ContainerBuilder"); } /** * The components within this container. */ components; /** * Creates a new container from API data. * * @param data - The API data to create this container with * @example * Creating a container from an API data object: * ```ts * const container = new ContainerBuilder({ * components: [ * { * content: "Some text here", * type: ComponentType.TextDisplay, * }, * ], * }); * ``` * @example * Creating a container using setters and API data: * ```ts * const container = new ContainerBuilder({ * components: [ * { * content: "# Heading", * type: ComponentType.TextDisplay, * }, * ], * }) * .addComponents(separator, section); * ``` */ constructor({ components, ...data } = {}) { super({ type: import_v1015.ComponentType.Container, ...data }); this.components = components?.map((component) => createComponentBuilder(component)) ?? []; } /** * Sets the accent color of this container. * * @param color - The color to use */ setAccentColor(color) { containerColorPredicate.parse(color); if (Array.isArray(color)) { const [red, green, blue] = color; this.data.accent_color = (red << 16) + (green << 8) + blue; return this; } this.data.accent_color = color; return this; } /** * Clears the accent color of this container. */ clearAccentColor() { this.data.accent_color = void 0; return this; } /** * Adds action row components to this container. * * @param components - The action row components to add */ addActionRowComponents(...components) { this.components.push( ...normalizeArray(components).map((component) => resolveBuilder(component, ActionRowBuilder)) ); return this; } /** * Adds file components to this container. * * @param components - The file components to add */ addFileComponents(...components) { this.components.push(...normalizeArray(components).map((component) => resolveBuilder(component, FileBuilder))); return this; } /** * Adds media gallery components to this container. * * @param components - The media gallery components to add */ addMediaGalleryComponents(...components) { this.components.push( ...normalizeArray(components).map((component) => resolveBuilder(component, MediaGalleryBuilder)) ); return this; } /** * Adds section components to this container. * * @param components - The section components to add */ addSectionComponents(...components) { this.components.push(...normalizeArray(components).map((component) => resolveBuilder(component, SectionBuilder))); return this; } /** * Adds separator components to this container. * * @param components - The separator components to add */ addSeparatorComponents(...components) { this.components.push(...normalizeArray(components).map((component) => resolveBuilder(component, SeparatorBuilder))); return this; } /** * Adds text display components to this container. * * @param components - The text display components to add */ addTextDisplayComponents(...components) { this.components.push( ...normalizeArray(components).map((component) => resolveBuilder(component, TextDisplayBuilder)) ); return this; } /** * Removes, replaces, or inserts components for this container. * * @param index - The index to start removing, replacing or inserting components * @param deleteCount - The amount of components to remove * @param components - The components to set */ spliceComponents(index, deleteCount, ...components) { this.components.splice( index, deleteCount, ...normalizeArray(components).map( (component) => component instanceof ComponentBuilder ? component : createComponentBuilder(component) ) ); return this; } /** * Sets the spoiler status of this container. * * @param spoiler - The spoiler status to use */ setSpoiler(spoiler = true) { this.data.spoiler = spoilerPredicate.parse(spoiler); return this; } /** * {@inheritDoc ComponentBuilder.toJSON} */ toJSON() { return { ...this.data, components: this.components.map((component) => component.toJSON()) }; } }; // src/components/v2/MediaGallery.ts var import_v1016 = require("discord-api-types/v10"); // src/components/v2/MediaGalleryItem.ts var MediaGalleryItemBuilder = class { static { __name(this, "MediaGalleryItemBuilder"); } /** * The API data associated with this media gallery item. */ data; /** * Creates a new media gallery item from API data. * * @param data - The API data to create this media gallery item with * @example * Creating a media gallery item from an API data object: * ```ts * const item = new MediaGalleryItemBuilder({ * description: "Some text here", * media: { * url: 'https://cdn.discordapp.com/embed/avatars/2.png', * }, * }); * ``` * @example * Creating a media gallery item using setters and API data: * ```ts * const item = new MediaGalleryItemBuilder({ * media: { * url: 'https://cdn.discordapp.com/embed/avatars/5.png', * }, * }) * .setDescription("alt text"); * ``` */ constructor(data = {}) { this.data = data; } /** * Sets the description of this media gallery item. * * @param description - The description to use */ setDescription(description) { this.data.description = descriptionPredicate2.parse(description); return this; } /** * Clears the description of this media gallery item. */ clearDescription() { this.data.description = void 0; return this; } /** * Sets the spoiler status of this media gallery item. * * @param spoiler - The spoiler status to use */ setSpoiler(spoiler = true) { this.data.spoiler = spoilerPredicate.parse(spoiler); return this; } /** * Sets the media URL of this media gallery item. * * @param url - The URL to use */ setURL(url) { this.data.media = unfurledMediaItemPredicate.parse({ url }); return this; } /** * Serializes this builder to API-compatible JSON data. * * @remarks * This method runs validations on the data before serializing it. * As such, it may throw an error if the data is invalid. */ toJSON() { unfurledMediaItemPredicate.parse(this.data.media); return { ...this.data }; } }; // src/components/v2/MediaGallery.ts var MediaGalleryBuilder = class extends ComponentBuilder { static { __name(this, "MediaGalleryBuilder"); } /** * The components within this container. */ items; /** * Creates a new media gallery from API data. * * @param data - The API data to create this media gallery with * @example * Creating a media gallery from an API data object: * ```ts * const mediaGallery = new MediaGalleryBuilder({ * items: [ * { * description: "Some text here", * media: { * url: 'https://cdn.discordapp.com/embed/avatars/2.png', * }, * }, * ], * }); * ``` * @example * Creating a media gallery using setters and API data: * ```ts * const mediaGallery = new MediaGalleryBuilder({ * items: [ * { * description: "alt text", * media: { * url: 'https://cdn.discordapp.com/embed/avatars/5.png', * }, * }, * ], * }) * .addItems(item2, item3); * ``` */ constructor({ items, ...data } = {}) { super({ type: import_v1016.ComponentType.MediaGallery, ...data }); this.items = items?.map((item) => new MediaGalleryItemBuilder(item)) ?? []; } /** * Adds items to this media gallery. * * @param items - The items to add */ addItems(...items) { this.items.push( ...normalizeArray(items).map((input) => { const result = resolveBuilder(input, MediaGalleryItemBuilder); assertReturnOfBuilder(result, MediaGalleryItemBuilder); return result; }) ); return this; } /** * Removes, replaces, or inserts media gallery items for this media gallery. * * @param index - The index to start removing, replacing or inserting items * @param deleteCount - The amount of items to remove * @param items - The items to insert */ spliceItems(index, deleteCount, ...items) { this.items.splice( index, deleteCount, ...normalizeArray(items).map((input) => { const result = resolveBuilder(input, MediaGalleryItemBuilder); assertReturnOfBuilder(result, MediaGalleryItemBuilder); return result; }) ); return this; } /** * {@inheritDoc ComponentBuilder.toJSON} */ toJSON() { validateComponentArray(this.items, 1, 10, MediaGalleryItemBuilder); return { ...this.data, items: this.items.map((item) => item.toJSON()) }; } }; // src/components/v2/Section.ts var import_v1017 = require("discord-api-types/v10"); var SectionBuilder = class extends ComponentBuilder { static { __name(this, "SectionBuilder"); } /** * The components within this section. */ components; /** * The accessory of this section. */ accessory; /** * Creates a new section from API data. * * @param data - The API data to create this section with * @example * Creating a section from an API data object: * ```ts * const section = new SectionBuilder({ * components: [ * { * content: "Some text here", * type: ComponentType.TextDisplay, * }, * ], * accessory: { * media: { * url: 'https://cdn.discordapp.com/embed/avatars/3.png', * }, * } * }); * ``` * @example * Creating a section using setters and API data: * ```ts * const section = new SectionBuilder({ * components: [ * { * content: "# Heading", * type: ComponentType.TextDisplay, * }, * ], * }) * .setPrimaryButtonAccessory(button); * ``` */ constructor({ components, accessory, ...data } = {}) { super({ type: import_v1017.ComponentType.Section, ...data }); this.components = components?.map((component) => createComponentBuilder(component)) ?? []; this.accessory = accessory ? createComponentBuilder(accessory) : void 0; } /** * Sets the accessory of this section to a button. * * @param accessory - The accessory to use */ setButtonAccessory(accessory) { Reflect.set(this, "accessory", accessoryPredicate.parse(resolveBuilder(accessory, ButtonBuilder))); return this; } /** * Sets the accessory of this section to a thumbnail. * * @param accessory - The accessory to use */ setThumbnailAccessory(accessory) { Reflect.set(this, "accessory", accessoryPredicate.parse(resolveBuilder(accessory, ThumbnailBuilder))); return this; } /** * Adds text display components to this section. * * @param components - The text display components to add */ addTextDisplayComponents(...components) { this.components.push( ...normalizeArray(components).map((input) => { const result = resolveBuilder(input, TextDisplayBuilder); assertReturnOfBuilder(result, TextDisplayBuilder); return result; }) ); return this; } /** * Removes, replaces, or inserts text display components for this section. * * @param index - The index to start removing, replacing or inserting text display components * @param deleteCount - The amount of text display components to remove * @param components - The text display components to insert */ spliceTextDisplayComponents(index, deleteCount, ...components) { this.components.splice( index, deleteCount, ...normalizeArray(components).map((input) => { const result = resolveBuilder(input, TextDisplayBuilder); assertReturnOfBuilder(result, TextDisplayBuilder); return result; }) ); return this; } /** * {@inheritDoc ComponentBuilder.toJSON} */ toJSON() { validateComponentArray(this.components, 1, 3, TextDisplayBuilder); return { ...this.data, components: this.components.map((component) => component.toJSON()), accessory: accessoryPredicate.parse(this.accessory).toJSON() }; } }; // src/components/Components.ts function createComponentBuilder(data) { if (data instanceof ComponentBuilder) { return data; } switch (data.type) { case import_v1018.ComponentType.ActionRow: return new ActionRowBuilder(data); case import_v1018.ComponentType.Button: return new ButtonBuilder(data); case import_v1018.ComponentType.StringSelect: return new StringSelectMenuBuilder(data); case import_v1018.ComponentType.TextInput: return new TextInputBuilder(data); case import_v1018.ComponentType.UserSelect: return new UserSelectMenuBuilder(data); case import_v1018.ComponentType.RoleSelect: return new RoleSelectMenuBuilder(data); case import_v1018.ComponentType.MentionableSelect: return new MentionableSelectMenuBuilder(data); case import_v1018.ComponentType.ChannelSelect: return new ChannelSelectMenuBuilder(data); case import_v1018.ComponentType.File: return new FileBuilder(data); case import_v1018.ComponentType.Container: return new ContainerBuilder(data); case import_v1018.ComponentType.Section: return new SectionBuilder(data); case import_v1018.ComponentType.Separator: return new SeparatorBuilder(data); case import_v1018.ComponentType.TextDisplay: return new TextDisplayBuilder(data); case import_v1018.ComponentType.Thumbnail: return new ThumbnailBuilder(data); case import_v1018.ComponentType.MediaGallery: return new MediaGalleryBuilder(data); default: throw new Error(`Cannot properly serialize component type: ${data.type}`); } } __name(createComponentBuilder, "createComponentBuilder"); function isBuilder(builder, Constructor) { return builder instanceof Constructor; } __name(isBuilder, "isBuilder"); function resolveBuilder(builder, Constructor) { if (isBuilder(builder, Constructor)) { return builder; } if (typeof builder === "function") { return builder(new Constructor()); } return new Constructor(builder); } __name(resolveBuilder, "resolveBuilder"); // src/components/ActionRow.ts var ActionRowBuilder = class extends ComponentBuilder { static { __name(this, "ActionRowBuilder"); } /** * The components within this action row. */ components; /** * Creates a new action row from API data. * * @param data - The API data to create this action row with * @example * Creating an action row from an API data object: * ```ts * const actionRow = new ActionRowBuilder({ * components: [ * { * custom_id: "custom id", * label: "Type something", * style: TextInputStyle.Short, * type: ComponentType.TextInput, * }, * ], * }); * ``` * @example * Creating an action row using setters and API data: * ```ts * const actionRow = new ActionRowBuilder({ * components: [ * { * custom_id: "custom id", * label: "Click me", * style: ButtonStyle.Primary, * type: ComponentType.Button, * }, * ], * }) * .addComponents(button2, button3); * ``` */ constructor({ components, ...data } = {}) { super({ type: import_v1019.ComponentType.ActionRow, ...data }); this.components = components?.map((component) => createComponentBuilder(component)) ?? []; } /** * Adds components to this action row. * * @param components - The components to add */ addComponents(...components) { this.components.push(...normalizeArray(components)); return this; } /** * Sets components for this action row. * * @param components - The components to set */ setComponents(...components) { this.components.splice(0, this.components.length, ...normalizeArray(components)); return this; } /** * {@inheritDoc ComponentBuilder.toJSON} */ toJSON() { return { ...this.data, components: this.components.map((component) => component.toJSON()) }; } }; // src/interactions/modals/Assertions.ts var Assertions_exports5 = {}; __export(Assertions_exports5, { 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); function validateRequiredParameters2(customId, title, components) { customIdValidator.parse(customId); titleValidator.parse(title); componentsValidator.parse(components); } __name(validateRequiredParameters2, "validateRequiredParameters"); // src/interactions/modals/Modal.ts var ModalBuilder = class { static { __name(this, "ModalBuilder"); } /** * The API data associated with this modal. */ data; /** * The components within this modal. */ components = []; /** * Creates a new modal from API data. * * @param data - The API data to create this modal with */ constructor({ components, ...data } = {}) { this.data = { ...data }; this.components = components?.map((component) => createComponentBuilder(component)) ?? []; } /** * Sets the title of this modal. * * @param title - The title to use */ setTitle(title) { this.data.title = titleValidator.parse(title); return this; } /** * Sets the custom id of this modal. * * @param customId - The custom id to use */ setCustomId(customId) { this.data.custom_id = customIdValidator.parse(customId); return this; } /** * Adds components to this modal. * * @param components - The components to add */ addComponents(...components) { this.components.push( ...normalizeArray(components).map( (component) => component instanceof ActionRowBuilder ? component : new ActionRowBuilder(component) ) ); return this; } /** * Sets components for this modal. * * @param components - The components to set */ setComponents(...components) { this.components.splice(0, this.components.length, ...normalizeArray(components)); return this; } /** * {@inheritDoc ComponentBuilder.toJSON} */ toJSON() { validateRequiredParameters2(this.data.custom_id, this.data.title, this.components); return { ...this.data, components: this.components.map((component) => component.toJSON()) }; } }; // src/interactions/slashCommands/Assertions.ts var Assertions_exports6 = {}; __export(Assertions_exports6, { assertReturnOfBuilder: () => assertReturnOfBuilder2, contextsPredicate: () => contextsPredicate, integrationTypesPredicate: () => integrationTypesPredicate, localizationMapPredicate: () => localizationMapPredicate, validateChoicesLength: () => validateChoicesLength, validateDMPermission: () => validateDMPermission, validateDefaultMemberPermissions: () => validateDefaultMemberPermissions, validateDefaultPermission: () => validateDefaultPermission, validateDescription: () => validateDescription, validateLocale: () => validateLocale, validateLocalizationMap: () => validateLocalizationMap, validateMaxOptionsLength: () => validateMaxOptionsLength, validateNSFW: () => validateNSFW, validateName: () => validateName, validateRequired: () => validateRequired, validateRequiredParameters: () => validateRequiredParameters3 }); var import_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); 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); function validateDescription(description) { descriptionPredicate3.parse(description); } __name(validateDescription, "validateDescription"); var maxArrayLengthPredicate = import_shapeshift6.s.unknown().array().lengthLessThanOrEqual(25).setValidationEnabled(isValidationEnabled); function validateLocale(locale) { return localePredicate.parse(locale); } __name(validateLocale, "validateLocale"); function validateMaxOptionsLength(options) { maxArrayLengthPredicate.parse(options); } __name(validateMaxOptionsLength, "validateMaxOptionsLength"); function validateRequiredParameters3(name, description, options) { validateName(name); validateDescription(description); validateMaxOptionsLength(options); } __name(validateRequiredParameters3, "validateRequiredParameters"); var booleanPredicate = import_shapeshift6.s.boolean(); function validateDefaultPermission(value) { booleanPredicate.parse(value); } __name(validateDefaultPermission, "validateDefaultPermission"); function validateRequired(required) { booleanPredicate.parse(required); } __name(validateRequired, "validateRequired"); var choicesLengthPredicate = import_shapeshift6.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); } __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); function validateLocalizationMap(value) { localizationMapPredicate.parse(value); } __name(validateLocalizationMap, "validateLocalizationMap"); var dmPermissionPredicate = import_shapeshift6.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+$/) ]).nullish(); function validateDefaultMemberPermissions(permissions) { return memberPermissionPredicate.parse(permissions); } __name(validateDefaultMemberPermissions, "validateDefaultMemberPermissions"); 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 integrationTypesPredicate = import_shapeshift6.s.array( import_shapeshift6.s.nativeEnum(import_v1020.ApplicationIntegrationType).setValidationEnabled(isValidationEnabled) ); // src/interactions/slashCommands/SlashCommandBuilder.ts var import_ts_mixer6 = require("ts-mixer"); // src/interactions/slashCommands/mixins/NameAndDescription.ts var SharedNameAndDescription = class { static { __name(this, "SharedNameAndDescription"); } /** * The name of this command. */ name; /** * The name localizations of this command. */ name_localizations; /** * The description of this command. */ description; /** * The description localizations of this command. */ description_localizations; /** * Sets the name of this command. * * @param name - The name to use */ setName(name) { validateName(name); Reflect.set(this, "name", name); return this; } /** * Sets the description of this command. * * @param description - The description to use */ setDescription(description) { validateDescription(description); Reflect.set(this, "description", description); return this; } /** * Sets a name localization for this command. * * @param locale - The locale to set * @param localizedName - The localized name for the given `locale` */ setNameLocalization(locale, localizedName) { if (!this.name_localizations) { Reflect.set(this, "name_localizations", {}); } const parsedLocale = validateLocale(locale); if (localizedName === null) { this.name_localizations[parsedLocale] = null; return this; } validateName(localizedName); this.name_localizations[parsedLocale] = localizedName; return this; } /** * Sets the name localizations for this command. * * @param localizedNames - The object of localized names to set */ setNameLocalizations(localizedNames) { if (localizedNames === null) { Reflect.set(this, "name_localizations", null); return this; } Reflect.set(this, "name_localizations", {}); for (const args of Object.entries(localizedNames)) { this.setNameLocalization(...args); } return this; } /** * Sets a description localization for this command. * * @param locale - The locale to set * @param localizedDescription - The localized description for the given locale */ setDescriptionLocalization(locale, localizedDescription) { if (!this.description_localizations) { Reflect.set(this, "description_localizations", {}); } const parsedLocale = validateLocale(locale); if (localizedDescription === null) { this.description_localizations[parsedLocale] = null; return this; } validateDescription(localizedDescription); this.description_localizations[parsedLocale] = localizedDescription; return this; } /** * Sets the description localizations for this command. * * @param localizedDescriptions - The object of localized descriptions to set */ setDescriptionLocalizations(localizedDescriptions) { if (localizedDescriptions === null) { Reflect.set(this, "description_localizations", null); return this; } Reflect.set(this, "description_localizations", {}); for (const args of Object.entries(localizedDescriptions)) { this.setDescriptionLocalization(...args); } return this; } }; // src/interactions/slashCommands/mixins/SharedSlashCommand.ts var import_v1021 = require("discord-api-types/v10"); var SharedSlashCommand = class { static { __name(this, "SharedSlashCommand"); } name = void 0; name_localizations; description = void 0; description_localizations; options = []; contexts; /** * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.setDMPermission} instead. */ default_permission = void 0; default_member_permissions = void 0; /** * @deprecated Use {@link SharedSlashCommand.contexts} instead. */ dm_permission = void 0; integration_types; nsfw = void 0; /** * Sets the contexts of this command. * * @param contexts - The contexts */ setContexts(...contexts) { Reflect.set(this, "contexts", contextsPredicate.parse(normalizeArray(contexts))); return this; } /** * Sets the integration types of this command. * * @param integrationTypes - The integration types */ setIntegrationTypes(...integrationTypes) { Reflect.set(this, "integration_types", integrationTypesPredicate.parse(normalizeArray(integrationTypes))); return this; } /** * Sets whether the command is enabled by default when the application is added to a guild. * * @remarks * If set to `false`, you will have to later `PUT` the permissions for this command. * @param value - Whether or not to enable this command by default * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions} * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.setDMPermission} instead. */ setDefaultPermission(value) { validateDefaultPermission(value); Reflect.set(this, "default_permission", value); return this; } /** * Sets the default permissions a member should have in order to run the command. * * @remarks * You can set this to `'0'` to disable the command by default. * @param permissions - The permissions bit field to set * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions} */ setDefaultMemberPermissions(permissions) { const permissionValue = validateDefaultMemberPermissions(permissions); Reflect.set(this, "default_member_permissions", permissionValue); return this; } /** * Sets if the command is available in direct messages with the application. * * @remarks * By default, commands are visible. This method is only for global commands. * @param enabled - Whether the command should be enabled in direct messages * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions} * @deprecated * Use {@link SharedSlashCommand.setContexts} instead. */ setDMPermission(enabled) { validateDMPermission(enabled); Reflect.set(this, "dm_permission", enabled); return this; } /** * Sets whether this command is NSFW. * * @param nsfw - Whether this command is NSFW */ setNSFW(nsfw = true) { validateNSFW(nsfw); Reflect.set(this, "nsfw", nsfw); return this; } /** * Serializes this builder to API-compatible JSON data. * * @remarks * This method runs validations on the data before serializing it. * As such, it may throw an error if the data is invalid. */ toJSON() { validateRequiredParameters3(this.name, this.description, this.options); validateLocalizationMap(this.name_localizations); validateLocalizationMap(this.description_localizations); return { ...this, type: import_v1021.ApplicationCommandType.ChatInput, options: this.options.map((option) => option.toJSON()) }; } }; // src/interactions/slashCommands/options/attachment.ts var import_v1022 = require("discord-api-types/v10"); // src/interactions/slashCommands/mixins/ApplicationCommandOptionBase.ts var ApplicationCommandOptionBase = class extends SharedNameAndDescription { static { __name(this, "ApplicationCommandOptionBase"); } /** * Whether this option is required. * * @defaultValue `false` */ required = false; /** * Sets whether this option is required. * * @param required - Whether this option should be required */ setRequired(required) { validateRequired(required); Reflect.set(this, "required", required); return this; } /** * This method runs required validators on this builder. */ runRequiredValidations() { validateRequiredParameters3(this.name, this.description, []); validateLocalizationMap(this.name_localizations); validateLocalizationMap(this.description_localizations); validateRequired(this.required); } }; // src/interactions/slashCommands/options/attachment.ts var SlashCommandAttachmentOption = class extends ApplicationCommandOptionBase { static { __name(this, "SlashCommandAttachmentOption"); } /** * The type of this option. */ type = import_v1022.ApplicationCommandOptionType.Attachment; /** * {@inheritDoc ApplicationCommandOptionBase.toJSON} */ toJSON() { this.runRequiredValidations(); return { ...this }; } }; // src/interactions/slashCommands/options/boolean.ts var import_v1023 = require("discord-api-types/v10"); var SlashCommandBooleanOption = class extends ApplicationCommandOptionBase { static { __name(this, "SlashCommandBooleanOption"); } /** * The type of this option. */ type = import_v1023.ApplicationCommandOptionType.Boolean; /** * {@inheritDoc ApplicationCommandOptionBase.toJSON} */ toJSON() { this.runRequiredValidations(); return { ...this }; } }; // src/interactions/slashCommands/options/channel.ts var import_v1025 = 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 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 ]; var channelTypesPredicate = import_shapeshift7.s.array(import_shapeshift7.s.union(allowedChannelTypes.map((type) => import_shapeshift7.s.literal(type)))); var ApplicationCommandOptionChannelTypesMixin = class { static { __name(this, "ApplicationCommandOptionChannelTypesMixin"); } /** * The channel types of this option. */ channel_types; /** * Adds channel types to this option. * * @param channelTypes - The channel types */ addChannelTypes(...channelTypes) { if (this.channel_types === void 0) { Reflect.set(this, "channel_types", []); } this.channel_types.push(...channelTypesPredicate.parse(normalizeArray(channelTypes))); return this; } }; // src/interactions/slashCommands/options/channel.ts var SlashCommandChannelOption = class extends ApplicationCommandOptionBase { /** * The type of this option. */ type = import_v1025.ApplicationCommandOptionType.Channel; /** * {@inheritDoc ApplicationCommandOptionBase.toJSON} */ toJSON() { this.runRequiredValidations(); return { ...this }; } }; __name(SlashCommandChannelOption, "SlashCommandChannelOption"); SlashCommandChannelOption = __decorateClass([ (0, import_ts_mixer.mix)(ApplicationCommandOptionChannelTypesMixin) ], SlashCommandChannelOption); // src/interactions/slashCommands/options/integer.ts var import_shapeshift10 = require("@sapphire/shapeshift"); var import_v1027 = require("discord-api-types/v10"); var import_ts_mixer2 = require("ts-mixer"); // src/interactions/slashCommands/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.ts var ApplicationCommandNumericOptionMinMaxValueMixin = class { static { __name(this, "ApplicationCommandNumericOptionMinMaxValueMixin"); } /** * The maximum value of this option. */ max_value; /** * The minimum value of this option. */ min_value; }; // src/interactions/slashCommands/mixins/ApplicationCommandOptionWithAutocompleteMixin.ts var import_shapeshift8 = require("@sapphire/shapeshift"); var booleanPredicate2 = import_shapeshift8.s.boolean(); var ApplicationCommandOptionWithAutocompleteMixin = class { static { __name(this, "ApplicationCommandOptionWithAutocompleteMixin"); } /** * Whether this option utilizes autocomplete. */ autocomplete; /** * The type of this option. * * @privateRemarks Since this is present and this is a mixin, this is needed. */ type; /** * Whether this option uses autocomplete. * * @param autocomplete - Whether this option should use autocomplete */ setAutocomplete(autocomplete) { booleanPredicate2.parse(autocomplete); if (autocomplete && "choices" in this && Array.isArray(this.choices) && this.choices.length > 0) { throw new RangeError("Autocomplete and choices are mutually exclusive to each other."); } Reflect.set(this, "autocomplete", autocomplete); return this; } }; // 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({ name: stringPredicate, name_localizations: localizationMapPredicate, value: import_shapeshift9.s.union([stringPredicate, numberPredicate]) }).array(); var ApplicationCommandOptionWithChoicesMixin = class { static { __name(this, "ApplicationCommandOptionWithChoicesMixin"); } /** * The choices of this option. */ choices; /** * The type of this option. * * @privateRemarks Since this is present and this is a mixin, this is needed. */ type; /** * Adds multiple choices to this option. * * @param choices - The choices to add */ addChoices(...choices) { const normalizedChoices = normalizeArray(choices); if (normalizedChoices.length > 0 && "autocomplete" in this && this.autocomplete) { throw new RangeError("Autocomplete and choices are mutually exclusive to each other."); } choicesPredicate.parse(normalizedChoices); if (this.choices === void 0) { Reflect.set(this, "choices", []); } validateChoicesLength(normalizedChoices.length, this.choices); for (const { name, name_localizations, value } of normalizedChoices) { if (this.type === import_v1026.ApplicationCommandOptionType.String) { stringPredicate.parse(value); } else { numberPredicate.parse(value); } this.choices.push({ name, name_localizations, value }); } return this; } /** * Sets multiple choices for this option. * * @param choices - The choices to set */ setChoices(...choices) { const normalizedChoices = normalizeArray(choices); if (normalizedChoices.length > 0 && "autocomplete" in this && this.autocomplete) { throw new RangeError("Autocomplete and choices are mutually exclusive to each other."); } choicesPredicate.parse(normalizedChoices); Reflect.set(this, "choices", []); this.addChoices(normalizedChoices); return this; } }; // src/interactions/slashCommands/options/integer.ts var numberValidator = import_shapeshift10.s.number().int(); var SlashCommandIntegerOption = class extends ApplicationCommandOptionBase { /** * The type of this option. */ type = import_v1027.ApplicationCommandOptionType.Integer; /** * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue} */ setMaxValue(max) { numberValidator.parse(max); Reflect.set(this, "max_value", max); return this; } /** * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue} */ setMinValue(min) { numberValidator.parse(min); Reflect.set(this, "min_value", min); return this; } /** * {@inheritDoc ApplicationCommandOptionBase.toJSON} */ toJSON() { this.runRequiredValidations(); if (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) { throw new RangeError("Autocomplete and choices are mutually exclusive to each other."); } return { ...this }; } }; __name(SlashCommandIntegerOption, "SlashCommandIntegerOption"); SlashCommandIntegerOption = __decorateClass([ (0, import_ts_mixer2.mix)( ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithAutocompleteMixin, ApplicationCommandOptionWithChoicesMixin ) ], SlashCommandIntegerOption); // src/interactions/slashCommands/options/mentionable.ts var import_v1028 = require("discord-api-types/v10"); var SlashCommandMentionableOption = class extends ApplicationCommandOptionBase { static { __name(this, "SlashCommandMentionableOption"); } /** * The type of this option. */ type = import_v1028.ApplicationCommandOptionType.Mentionable; /** * {@inheritDoc ApplicationCommandOptionBase.toJSON} */ toJSON() { this.runRequiredValidations(); return { ...this }; } }; // src/interactions/slashCommands/options/number.ts var import_shapeshift11 = require("@sapphire/shapeshift"); var import_v1029 = require("discord-api-types/v10"); var import_ts_mixer3 = require("ts-mixer"); var numberValidator2 = import_shapeshift11.s.number(); var SlashCommandNumberOption = class extends ApplicationCommandOptionBase { /** * The type of this option. */ type = import_v1029.ApplicationCommandOptionType.Number; /** * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue} */ setMaxValue(max) { numberValidator2.parse(max); Reflect.set(this, "max_value", max); return this; } /** * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue} */ setMinValue(min) { numberValidator2.parse(min); Reflect.set(this, "min_value", min); return this; } /** * {@inheritDoc ApplicationCommandOptionBase.toJSON} */ toJSON() { this.runRequiredValidations(); if (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) { throw new RangeError("Autocomplete and choices are mutually exclusive to each other."); } return { ...this }; } }; __name(SlashCommandNumberOption, "SlashCommandNumberOption"); SlashCommandNumberOption = __decorateClass([ (0, import_ts_mixer3.mix)( ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithAutocompleteMixin, ApplicationCommandOptionWithChoicesMixin ) ], SlashCommandNumberOption); // src/interactions/slashCommands/options/role.ts var import_v1030 = require("discord-api-types/v10"); var SlashCommandRoleOption = class extends ApplicationCommandOptionBase { static { __name(this, "SlashCommandRoleOption"); } /** * The type of this option. */ type = import_v1030.ApplicationCommandOptionType.Role; /** * {@inheritDoc ApplicationCommandOptionBase.toJSON} */ toJSON() { this.runRequiredValidations(); return { ...this }; } }; // src/interactions/slashCommands/options/string.ts var import_shapeshift12 = require("@sapphire/shapeshift"); var import_v1031 = 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 SlashCommandStringOption = class extends ApplicationCommandOptionBase { /** * The type of this option. */ type = import_v1031.ApplicationCommandOptionType.String; /** * The maximum length of this option. */ max_length; /** * The minimum length of this option. */ min_length; /** * Sets the maximum length of this string option. * * @param max - The maximum length this option can be */ setMaxLength(max) { maxLengthValidator2.parse(max); Reflect.set(this, "max_length", max); return this; } /** * Sets the minimum length of this string option. * * @param min - The minimum length this option can be */ setMinLength(min) { minLengthValidator2.parse(min); Reflect.set(this, "min_length", min); return this; } /** * {@inheritDoc ApplicationCommandOptionBase.toJSON} */ toJSON() { this.runRequiredValidations(); if (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) { throw new RangeError("Autocomplete and choices are mutually exclusive to each other."); } return { ...this }; } }; __name(SlashCommandStringOption, "SlashCommandStringOption"); SlashCommandStringOption = __decorateClass([ (0, import_ts_mixer4.mix)(ApplicationCommandOptionWithAutocompleteMixin, ApplicationCommandOptionWithChoicesMixin) ], SlashCommandStringOption); // src/interactions/slashCommands/options/user.ts var import_v1032 = require("discord-api-types/v10"); var SlashCommandUserOption = class extends ApplicationCommandOptionBase { static { __name(this, "SlashCommandUserOption"); } /** * The type of this option. */ type = import_v1032.ApplicationCommandOptionType.User; /** * {@inheritDoc ApplicationCommandOptionBase.toJSON} */ toJSON() { this.runRequiredValidations(); return { ...this }; } }; // src/interactions/slashCommands/mixins/SharedSlashCommandOptions.ts var SharedSlashCommandOptions = class { static { __name(this, "SharedSlashCommandOptions"); } options; /** * Adds a boolean option. * * @param input - A function that returns an option builder or an already built builder */ addBooleanOption(input) { return this._sharedAddOptionMethod(input, SlashCommandBooleanOption); } /** * Adds a user option. * * @param input - A function that returns an option builder or an already built builder */ addUserOption(input) { return this._sharedAddOptionMethod(input, SlashCommandUserOption); } /** * Adds a channel option. * * @param input - A function that returns an option builder or an already built builder */ addChannelOption(input) { return this._sharedAddOptionMethod(input, SlashCommandChannelOption); } /** * Adds a role option. * * @param input - A function that returns an option builder or an already built builder */ addRoleOption(input) { return this._sharedAddOptionMethod(input, SlashCommandRoleOption); } /** * Adds an attachment option. * * @param input - A function that returns an option builder or an already built builder */ addAttachmentOption(input) { return this._sharedAddOptionMethod(input, SlashCommandAttachmentOption); } /** * Adds a mentionable option. * * @param input - A function that returns an option builder or an already built builder */ addMentionableOption(input) { return this._sharedAddOptionMethod(input, SlashCommandMentionableOption); } /** * Adds a string option. * * @param input - A function that returns an option builder or an already built builder */ addStringOption(input) { return this._sharedAddOptionMethod(input, SlashCommandStringOption); } /** * Adds an integer option. * * @param input - A function that returns an option builder or an already built builder */ addIntegerOption(input) { return this._sharedAddOptionMethod(input, SlashCommandIntegerOption); } /** * Adds a number option. * * @param input - A function that returns an option builder or an already built builder */ addNumberOption(input) { return this._sharedAddOptionMethod(input, SlashCommandNumberOption); } /** * Where the actual adding magic happens. ✨ * * @param input - The input. What else? * @param Instance - The instance of whatever is being added * @internal */ _sharedAddOptionMethod(input, Instance) { const { options } = this; validateMaxOptionsLength(options); const result = typeof input === "function" ? input(new Instance()) : input; assertReturnOfBuilder2(result, Instance); options.push(result); return this; } }; // src/interactions/slashCommands/SlashCommandSubcommands.ts var import_v1033 = require("discord-api-types/v10"); var import_ts_mixer5 = require("ts-mixer"); var SlashCommandSubcommandGroupBuilder = class { /** * The name of this subcommand group. */ name = void 0; /** * The description of this subcommand group. */ description = void 0; /** * The subcommands within this subcommand group. */ options = []; /** * Adds a new subcommand to this group. * * @param input - A function that returns a subcommand builder or an already built builder */ addSubcommand(input) { const { options } = this; validateMaxOptionsLength(options); const result = typeof input === "function" ? input(new SlashCommandSubcommandBuilder()) : input; assertReturnOfBuilder2(result, SlashCommandSubcommandBuilder); options.push(result); return this; } /** * Serializes this builder to API-compatible JSON data. * * @remarks * This method runs validations on the data before serializing it. * As such, it may throw an error if the data is invalid. */ toJSON() { validateRequiredParameters3(this.name, this.description, this.options); return { type: import_v1033.ApplicationCommandOptionType.SubcommandGroup, name: this.name, name_localizations: this.name_localizations, description: this.description, description_localizations: this.description_localizations, options: this.options.map((option) => option.toJSON()) }; } }; __name(SlashCommandSubcommandGroupBuilder, "SlashCommandSubcommandGroupBuilder"); SlashCommandSubcommandGroupBuilder = __decorateClass([ (0, import_ts_mixer5.mix)(SharedNameAndDescription) ], SlashCommandSubcommandGroupBuilder); var SlashCommandSubcommandBuilder = class { /** * The name of this subcommand. */ name = void 0; /** * The description of this subcommand. */ description = void 0; /** * The options within this subcommand. */ options = []; /** * Serializes this builder to API-compatible JSON data. * * @remarks * This method runs validations on the data before serializing it. * As such, it may throw an error if the data is invalid. */ toJSON() { validateRequiredParameters3(this.name, this.description, this.options); return { type: import_v1033.ApplicationCommandOptionType.Subcommand, name: this.name, name_localizations: this.name_localizations, description: this.description, description_localizations: this.description_localizations, options: this.options.map((option) => option.toJSON()) }; } }; __name(SlashCommandSubcommandBuilder, "SlashCommandSubcommandBuilder"); SlashCommandSubcommandBuilder = __decorateClass([ (0, import_ts_mixer5.mix)(SharedNameAndDescription, SharedSlashCommandOptions) ], SlashCommandSubcommandBuilder); // src/interactions/slashCommands/mixins/SharedSubcommands.ts var SharedSlashCommandSubcommands = class { static { __name(this, "SharedSlashCommandSubcommands"); } options = []; /** * Adds a new subcommand group to this command. * * @param input - A function that returns a subcommand group builder or an already built builder */ addSubcommandGroup(input) { const { options } = this; validateMaxOptionsLength(options); const result = typeof input === "function" ? input(new SlashCommandSubcommandGroupBuilder()) : input; assertReturnOfBuilder2(result, SlashCommandSubcommandGroupBuilder); options.push(result); return this; } /** * Adds a new subcommand to this command. * * @param input - A function that returns a subcommand builder or an already built builder */ addSubcommand(input) { const { options } = this; validateMaxOptionsLength(options); const result = typeof input === "function" ? input(new SlashCommandSubcommandBuilder()) : input; assertReturnOfBuilder2(result, SlashCommandSubcommandBuilder); options.push(result); return this; } }; // src/interactions/slashCommands/SlashCommandBuilder.ts var SlashCommandBuilder = class { /** * The name of this command. */ name = void 0; /** * The name localizations of this command. */ name_localizations; /** * The description of this command. */ description = void 0; /** * The description localizations of this command. */ description_localizations; /** * The options of this command. */ options = []; /** * The contexts for this command. */ contexts; /** * Whether this command is enabled by default when the application is added to a guild. * * @deprecated Use {@link SharedSlashCommand.setDefaultMemberPermissions} or {@link SharedSlashCommand.setDMPermission} instead. */ default_permission = void 0; /** * The set of permissions represented as a bit set for the command. */ default_member_permissions = void 0; /** * Indicates whether the command is available in direct messages with the application. * * @remarks * By default, commands are visible. This property is only for global commands. * @deprecated * Use {@link SlashCommandBuilder.contexts} instead. */ dm_permission = void 0; /** * The integration types for this command. */ integration_types; /** * Whether this command is NSFW. */ nsfw = void 0; }; __name(SlashCommandBuilder, "SlashCommandBuilder"); SlashCommandBuilder = __decorateClass([ (0, import_ts_mixer6.mix)(SharedSlashCommandOptions, SharedNameAndDescription, SharedSlashCommandSubcommands, SharedSlashCommand) ], SlashCommandBuilder); // src/interactions/contextMenuCommands/Assertions.ts var Assertions_exports7 = {}; __export(Assertions_exports7, { contextsPredicate: () => contextsPredicate2, integrationTypesPredicate: () => integrationTypesPredicate2, validateDMPermission: () => validateDMPermission2, validateDefaultMemberPermissions: () => validateDefaultMemberPermissions2, validateDefaultPermission: () => validateDefaultPermission2, validateName: () => validateName2, 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(/^( *[\p{P}\p{L}\p{N}\p{sc=Devanagari}\p{sc=Thai}]+ *)+$/u).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(); function validateDefaultPermission2(value) { booleanPredicate3.parse(value); } __name(validateDefaultPermission2, "validateDefaultPermission"); function validateName2(name) { namePredicate2.parse(name); } __name(validateName2, "validateName"); function validateType(type) { typePredicate.parse(type); } __name(validateType, "validateType"); function validateRequiredParameters4(name, type) { validateName2(name); validateType(type); } __name(validateRequiredParameters4, "validateRequiredParameters"); var dmPermissionPredicate2 = import_shapeshift13.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+$/) ]).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 integrationTypesPredicate2 = import_shapeshift13.s.array( import_shapeshift13.s.nativeEnum(import_v1034.ApplicationIntegrationType).setValidationEnabled(isValidationEnabled) ); // src/interactions/contextMenuCommands/ContextMenuCommandBuilder.ts var ContextMenuCommandBuilder = class { static { __name(this, "ContextMenuCommandBuilder"); } /** * The name of this command. */ name = void 0; /** * The name localizations of this command. */ name_localizations; /** * The type of this command. */ type = void 0; /** * The contexts for this command. */ contexts; /** * Whether this command is enabled by default when the application is added to a guild. * * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead. */ default_permission = void 0; /** * The set of permissions represented as a bit set for the command. */ default_member_permissions = void 0; /** * Indicates whether the command is available in direct messages with the application. * * @remarks * By default, commands are visible. This property is only for global commands. * @deprecated * Use {@link ContextMenuCommandBuilder.contexts} instead. */ dm_permission = void 0; /** * The integration types for this command. */ integration_types; /** * Sets the contexts of this command. * * @param contexts - The contexts */ setContexts(...contexts) { Reflect.set(this, "contexts", contextsPredicate2.parse(normalizeArray(contexts))); return this; } /** * Sets integration types of this command. * * @param integrationTypes - The integration types */ setIntegrationTypes(...integrationTypes) { Reflect.set(this, "integration_types", integrationTypesPredicate2.parse(normalizeArray(integrationTypes))); return this; } /** * Sets the name of this command. * * @param name - The name to use */ setName(name) { validateName2(name); Reflect.set(this, "name", name); return this; } /** * Sets the type of this command. * * @param type - The type to use */ setType(type) { validateType(type); Reflect.set(this, "type", type); return this; } /** * Sets whether the command is enabled by default when the application is added to a guild. * * @remarks * If set to `false`, you will have to later `PUT` the permissions for this command. * @param value - Whether to enable this command by default * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions} * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead. */ setDefaultPermission(value) { validateDefaultPermission2(value); Reflect.set(this, "default_permission", value); return this; } /** * Sets the default permissions a member should have in order to run this command. * * @remarks * You can set this to `'0'` to disable the command by default. * @param permissions - The permissions bit field to set * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions} */ setDefaultMemberPermissions(permissions) { const permissionValue = validateDefaultMemberPermissions2(permissions); Reflect.set(this, "default_member_permissions", permissionValue); return this; } /** * Sets if the command is available in direct messages with the application. * * @remarks * By default, commands are visible. This method is only for global commands. * @param enabled - Whether the command should be enabled in direct messages * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions} * @deprecated Use {@link ContextMenuCommandBuilder.setContexts} instead. */ setDMPermission(enabled) { validateDMPermission2(enabled); Reflect.set(this, "dm_permission", enabled); return this; } /** * Sets a name localization for this command. * * @param locale - The locale to set * @param localizedName - The localized name for the given `locale` */ setNameLocalization(locale, localizedName) { if (!this.name_localizations) { Reflect.set(this, "name_localizations", {}); } const parsedLocale = validateLocale(locale); if (localizedName === null) { this.name_localizations[parsedLocale] = null; return this; } validateName2(localizedName); this.name_localizations[parsedLocale] = localizedName; return this; } /** * Sets the name localizations for this command. * * @param localizedNames - The object of localized names to set */ setNameLocalizations(localizedNames) { if (localizedNames === null) { Reflect.set(this, "name_localizations", null); return this; } Reflect.set(this, "name_localizations", {}); for (const args of Object.entries(localizedNames)) this.setNameLocalization(...args); return this; } /** * Serializes this builder to API-compatible JSON data. * * @remarks * This method runs validations on the data before serializing it. * As such, it may throw an error if the data is invalid. */ toJSON() { validateRequiredParameters4(this.name, this.type); validateLocalizationMap(this.name_localizations); return { ...this }; } }; // src/util/componentUtil.ts function embedLength(data) { return (data.title?.length ?? 0) + (data.description?.length ?? 0) + (data.fields?.reduce((prev, curr) => prev + curr.name.length + curr.value.length, 0) ?? 0) + (data.footer?.text.length ?? 0) + (data.author?.name.length ?? 0); } __name(embedLength, "embedLength"); // src/index.ts var version = "1.11.2"; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ActionRowBuilder, ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionBase, ApplicationCommandOptionChannelTypesMixin, ApplicationCommandOptionWithAutocompleteMixin, ApplicationCommandOptionWithChoicesMixin, BaseSelectMenuBuilder, ButtonBuilder, ChannelSelectMenuBuilder, ComponentAssertions, ComponentBuilder, ComponentsV2Assertions, ContainerBuilder, ContextMenuCommandAssertions, ContextMenuCommandBuilder, EmbedAssertions, EmbedBuilder, FileBuilder, MediaGalleryBuilder, MediaGalleryItemBuilder, MentionableSelectMenuBuilder, ModalAssertions, ModalBuilder, RoleSelectMenuBuilder, SectionBuilder, SelectMenuBuilder, SelectMenuOptionBuilder, SeparatorBuilder, SharedNameAndDescription, SharedSlashCommand, SharedSlashCommandOptions, SharedSlashCommandSubcommands, SlashCommandAssertions, SlashCommandAttachmentOption, SlashCommandBooleanOption, SlashCommandBuilder, SlashCommandChannelOption, SlashCommandIntegerOption, SlashCommandMentionableOption, SlashCommandNumberOption, SlashCommandRoleOption, SlashCommandStringOption, SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder, SlashCommandUserOption, StringSelectMenuBuilder, StringSelectMenuOptionBuilder, TextDisplayBuilder, TextInputAssertions, TextInputBuilder, ThumbnailBuilder, UserSelectMenuBuilder, createComponentBuilder, disableValidators, embedLength, enableValidators, isValidationEnabled, normalizeArray, resolveBuilder, version, ...require("@discordjs/formatters") }); //# sourceMappingURL=index.js.map