@discordjs/builders 2.0.0-dev.1766016119-427636ee7 → 2.0.0-dev.1766552010-7884ecd3a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/button/mixins/EmojiOrLabelButtonMixin.ts","../src/util/ValidationError.ts","../src/util/validation.ts","../src/components/Assertions.ts","../src/Assertions.ts","../src/components/Component.ts","../src/components/button/Button.ts","../src/components/button/CustomIdButton.ts","../src/components/button/LinkButton.ts","../src/components/button/PremiumButton.ts","../src/components/fileUpload/FileUpload.ts","../src/components/fileUpload/Assertions.ts","../src/components/label/Label.ts","../src/util/resolveBuilder.ts","../src/components/Components.ts","../src/components/ActionRow.ts","../src/util/normalizeArray.ts","../src/components/selectMenu/ChannelSelectMenu.ts","../src/components/selectMenu/BaseSelectMenu.ts","../src/components/selectMenu/MentionableSelectMenu.ts","../src/components/selectMenu/RoleSelectMenu.ts","../src/components/selectMenu/StringSelectMenu.ts","../src/components/selectMenu/StringSelectMenuOption.ts","../src/components/selectMenu/UserSelectMenu.ts","../src/components/textInput/TextInput.ts","../src/components/textInput/Assertions.ts","../src/components/v2/Container.ts","../src/components/v2/Assertions.ts","../src/components/v2/File.ts","../src/components/v2/MediaGallery.ts","../src/components/v2/MediaGalleryItem.ts","../src/components/v2/Section.ts","../src/components/v2/TextDisplay.ts","../src/components/v2/Thumbnail.ts","../src/components/v2/Separator.ts","../src/components/label/Assertions.ts","../src/interactions/commands/chatInput/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.ts","../src/interactions/commands/chatInput/mixins/ApplicationCommandOptionChannelTypesMixin.ts","../src/interactions/commands/chatInput/mixins/ApplicationCommandOptionWithAutocompleteMixin.ts","../src/interactions/commands/chatInput/mixins/ApplicationCommandOptionWithChoicesMixin.ts","../src/interactions/commands/chatInput/options/attachment.ts","../src/interactions/commands/SharedName.ts","../src/interactions/commands/SharedNameAndDescription.ts","../src/interactions/commands/chatInput/Assertions.ts","../src/interactions/commands/chatInput/options/ApplicationCommandOptionBase.ts","../src/interactions/commands/chatInput/options/boolean.ts","../src/interactions/commands/chatInput/options/channel.ts","../src/interactions/commands/chatInput/options/integer.ts","../src/interactions/commands/chatInput/options/mentionable.ts","../src/interactions/commands/chatInput/options/number.ts","../src/interactions/commands/chatInput/options/role.ts","../src/interactions/commands/chatInput/options/string.ts","../src/interactions/commands/chatInput/options/user.ts","../src/interactions/commands/chatInput/mixins/SharedChatInputCommandOptions.ts","../src/interactions/commands/chatInput/ChatInputCommandSubcommands.ts","../src/interactions/commands/chatInput/mixins/SharedSubcommands.ts","../src/interactions/commands/chatInput/ChatInputCommand.ts","../src/interactions/commands/Command.ts","../src/interactions/commands/contextMenu/Assertions.ts","../src/interactions/commands/contextMenu/ContextMenuCommand.ts","../src/interactions/commands/contextMenu/MessageCommand.ts","../src/interactions/commands/contextMenu/UserCommand.ts","../src/interactions/modals/Assertions.ts","../src/interactions/modals/Modal.ts","../src/messages/embed/Assertions.ts","../src/messages/embed/EmbedAuthor.ts","../src/messages/embed/EmbedField.ts","../src/messages/embed/EmbedFooter.ts","../src/messages/embed/Embed.ts","../src/messages/poll/Assertions.ts","../src/messages/poll/PollMedia.ts","../src/messages/poll/PollAnswerMedia.ts","../src/messages/poll/PollAnswer.ts","../src/messages/poll/PollQuestion.ts","../src/messages/poll/Poll.ts","../src/messages/Assertions.ts","../src/messages/AllowedMentions.ts","../src/messages/Attachment.ts","../src/messages/MessageReference.ts","../src/messages/Message.ts"],"sourcesContent":["export * from './components/button/mixins/EmojiOrLabelButtonMixin.js';\nexport * from './components/button/Button.js';\nexport * from './components/button/CustomIdButton.js';\nexport * from './components/button/LinkButton.js';\nexport * from './components/button/PremiumButton.js';\n\nexport * from './components/fileUpload/FileUpload.js';\nexport * from './components/fileUpload/Assertions.js';\n\nexport * from './components/label/Label.js';\nexport * from './components/label/Assertions.js';\n\nexport * from './components/selectMenu/BaseSelectMenu.js';\nexport * from './components/selectMenu/ChannelSelectMenu.js';\nexport * from './components/selectMenu/MentionableSelectMenu.js';\nexport * from './components/selectMenu/RoleSelectMenu.js';\nexport * from './components/selectMenu/StringSelectMenu.js';\nexport * from './components/selectMenu/StringSelectMenuOption.js';\nexport * from './components/selectMenu/UserSelectMenu.js';\n\nexport * from './components/textInput/TextInput.js';\nexport * from './components/textInput/Assertions.js';\n\nexport * from './components/ActionRow.js';\nexport * from './components/Assertions.js';\nexport * from './components/Component.js';\nexport * from './components/Components.js';\n\nexport * from './components/v2/Assertions.js';\nexport * from './components/v2/Container.js';\nexport * from './components/v2/File.js';\nexport * from './components/v2/MediaGallery.js';\nexport * from './components/v2/MediaGalleryItem.js';\nexport * from './components/v2/Section.js';\nexport * from './components/v2/Separator.js';\nexport * from './components/v2/TextDisplay.js';\nexport * from './components/v2/Thumbnail.js';\n\nexport * from './interactions/commands/chatInput/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nexport * from './interactions/commands/chatInput/mixins/ApplicationCommandOptionChannelTypesMixin.js';\nexport * from './interactions/commands/chatInput/mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nexport * from './interactions/commands/chatInput/mixins/ApplicationCommandOptionWithChoicesMixin.js';\nexport * from './interactions/commands/chatInput/mixins/SharedChatInputCommandOptions.js';\nexport * from './interactions/commands/chatInput/mixins/SharedSubcommands.js';\n\nexport * from './interactions/commands/chatInput/options/ApplicationCommandOptionBase.js';\nexport * from './interactions/commands/chatInput/options/boolean.js';\nexport * from './interactions/commands/chatInput/options/channel.js';\nexport * from './interactions/commands/chatInput/options/integer.js';\nexport * from './interactions/commands/chatInput/options/mentionable.js';\nexport * from './interactions/commands/chatInput/options/number.js';\nexport * from './interactions/commands/chatInput/options/role.js';\nexport * from './interactions/commands/chatInput/options/attachment.js';\nexport * from './interactions/commands/chatInput/options/string.js';\nexport * from './interactions/commands/chatInput/options/user.js';\n\nexport * from './interactions/commands/chatInput/Assertions.js';\nexport * from './interactions/commands/chatInput/ChatInputCommand.js';\nexport * from './interactions/commands/chatInput/ChatInputCommandSubcommands.js';\n\nexport * from './interactions/commands/contextMenu/Assertions.js';\nexport * from './interactions/commands/contextMenu/ContextMenuCommand.js';\nexport * from './interactions/commands/contextMenu/MessageCommand.js';\nexport * from './interactions/commands/contextMenu/UserCommand.js';\n\nexport * from './interactions/commands/Command.js';\nexport * from './interactions/commands/SharedName.js';\nexport * from './interactions/commands/SharedNameAndDescription.js';\n\nexport * from './interactions/modals/Assertions.js';\nexport * from './interactions/modals/Modal.js';\n\nexport * from './messages/embed/Assertions.js';\nexport * from './messages/embed/Embed.js';\nexport * from './messages/embed/EmbedAuthor.js';\nexport * from './messages/embed/EmbedField.js';\nexport * from './messages/embed/EmbedFooter.js';\n\nexport * from './messages/poll/Assertions.js';\nexport * from './messages/poll/Poll.js';\nexport * from './messages/poll/PollAnswer.js';\nexport * from './messages/poll/PollAnswerMedia.js';\nexport * from './messages/poll/PollMedia.js';\nexport * from './messages/poll/PollQuestion.js';\n\nexport * from './messages/AllowedMentions.js';\nexport * from './messages/Assertions.js';\nexport * from './messages/Attachment.js';\nexport * from './messages/Message.js';\nexport * from './messages/MessageReference.js';\n\nexport * from './util/normalizeArray.js';\nexport * from './util/resolveBuilder.js';\nexport { disableValidators, enableValidators, isValidationEnabled } from './util/validation.js';\nexport * from './util/ValidationError.js';\n\nexport * from './Assertions.js';\n\n// We expose this type in our public API. We shouldn't assume every user of builders is also using REST\nexport type { RawFile } from '@discordjs/util';\n\n/**\n * The {@link https://github.com/discordjs/discord.js/blob/main/packages/builders#readme | @discordjs/builders} version\n * that you are currently using.\n *\n * @privateRemarks This needs to explicitly be `string` so it is not typed as a \"const string\" that gets injected by esbuild.\n */\nexport const version = '2.0.0-dev.1766016119-427636ee7' as string;\n","import type { APIButtonComponent, APIButtonComponentWithSKUId, APIMessageComponentEmoji } from 'discord-api-types/v10';\n\nexport interface EmojiOrLabelButtonData extends Pick<\n\tExclude<APIButtonComponent, APIButtonComponentWithSKUId>,\n\t'emoji' | 'label'\n> {}\n\n/**\n * A mixin that adds emoji and label symbols to a button builder.\n */\nexport class EmojiOrLabelButtonMixin {\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: EmojiOrLabelButtonData;\n\n\t/**\n\t * Sets the emoji to display on this button.\n\t *\n\t * @param emoji - The emoji to use\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\tthis.data.emoji = emoji;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the emoji on this button.\n\t */\n\tpublic clearEmoji() {\n\t\tthis.data.emoji = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the label for this button.\n\t *\n\t * @param label - The label to use\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = label;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the label on this button.\n\t */\n\tpublic clearLabel() {\n\t\tthis.data.label = undefined;\n\t\treturn this;\n\t}\n}\n","import { z } from 'zod';\n\n/**\n * An error that is thrown when validation fails.\n */\nexport class ValidationError extends Error {\n\t/**\n\t * The underlying cause of the validation error.\n\t */\n\tpublic override readonly cause: z.ZodError;\n\n\t/**\n\t * @internal\n\t */\n\tpublic constructor(error: z.ZodError) {\n\t\tsuper(z.prettifyError(error));\n\n\t\tthis.name = 'ValidationError';\n\t\tthis.cause = error;\n\t}\n}\n","import type { z } from 'zod';\nimport { ValidationError } from './ValidationError.js';\n\nlet validationEnabled = true;\n\n/**\n * Enables validators.\n *\n * @returns Whether validation is occurring.\n */\nexport function enableValidators() {\n\treturn (validationEnabled = true);\n}\n\n/**\n * Disables validators.\n *\n * @returns Whether validation is occurring.\n */\nexport function disableValidators() {\n\treturn (validationEnabled = false);\n}\n\n/**\n * Checks whether validation is occurring.\n */\nexport function isValidationEnabled() {\n\treturn validationEnabled;\n}\n\n/**\n * Parses a value with a given validator, accounting for whether validation is enabled.\n *\n * @param validator - The zod validator to use\n * @param value - The value to parse\n * @param validationOverride - Force validation to run/not run regardless of your global preference\n * @returns The result from parsing\n * @throws {@link ValidationError}\n * Throws if the value does not pass validation, if enabled.\n * @internal\n */\nexport function validate<Validator extends z.ZodType>(\n\tvalidator: Validator,\n\tvalue: unknown,\n\tvalidationOverride?: boolean,\n): z.output<Validator> {\n\tif (validationOverride === false || (validationOverride === undefined && !isValidationEnabled())) {\n\t\treturn value as z.output<Validator>;\n\t}\n\n\tconst result = validator.safeParse(value);\n\n\tif (!result.success) {\n\t\tthrow new ValidationError(result.error);\n\t}\n\n\treturn result.data;\n}\n","import { ButtonStyle, ChannelType, ComponentType, SelectMenuDefaultValueType } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { idPredicate, customIdPredicate, snowflakePredicate } from '../Assertions.js';\n\nexport const emojiPredicate = z\n\t.strictObject({\n\t\tid: snowflakePredicate.optional(),\n\t\tname: z.string().min(2).max(32).optional(),\n\t\tanimated: z.boolean().optional(),\n\t})\n\t.refine((data) => data.id !== undefined || data.name !== undefined, {\n\t\terror: \"Either 'id' or 'name' must be provided\",\n\t});\n\nconst buttonPredicateBase = z.strictObject({\n\ttype: z.literal(ComponentType.Button),\n\tdisabled: z.boolean().optional(),\n});\n\nconst buttonLabelPredicate = z.string().min(1).max(80);\n\nconst buttonCustomIdPredicateBase = buttonPredicateBase\n\t.extend({\n\t\tcustom_id: customIdPredicate,\n\t\temoji: emojiPredicate.optional(),\n\t\tlabel: buttonLabelPredicate.optional(),\n\t})\n\t.refine((data) => data.emoji !== undefined || data.label !== undefined, {\n\t\tmessage: 'Buttons with a custom id must have either an emoji or a label.',\n\t});\n\nconst buttonPrimaryPredicate = buttonCustomIdPredicateBase.safeExtend({ style: z.literal(ButtonStyle.Primary) });\nconst buttonSecondaryPredicate = buttonCustomIdPredicateBase.safeExtend({ style: z.literal(ButtonStyle.Secondary) });\nconst buttonSuccessPredicate = buttonCustomIdPredicateBase.safeExtend({ style: z.literal(ButtonStyle.Success) });\nconst buttonDangerPredicate = buttonCustomIdPredicateBase.safeExtend({ style: z.literal(ButtonStyle.Danger) });\n\nconst buttonLinkPredicate = buttonPredicateBase\n\t.extend({\n\t\tstyle: z.literal(ButtonStyle.Link),\n\t\turl: z.url({ protocol: /^(?:https?|discord)$/ }).max(512),\n\t\temoji: emojiPredicate.optional(),\n\t\tlabel: buttonLabelPredicate.optional(),\n\t})\n\t.refine((data) => data.emoji !== undefined || data.label !== undefined, {\n\t\tmessage: 'Link buttons must have either an emoji or a label.',\n\t});\n\nconst buttonPremiumPredicate = buttonPredicateBase.extend({\n\tstyle: z.literal(ButtonStyle.Premium),\n\tsku_id: snowflakePredicate,\n});\n\nexport const buttonPredicate = z.discriminatedUnion('style', [\n\tbuttonLinkPredicate,\n\tbuttonPrimaryPredicate,\n\tbuttonSecondaryPredicate,\n\tbuttonSuccessPredicate,\n\tbuttonDangerPredicate,\n\tbuttonPremiumPredicate,\n]);\n\nconst selectMenuBasePredicate = z.object({\n\tid: idPredicate,\n\tplaceholder: z.string().max(150).optional(),\n\tmin_values: z.number().min(0).max(25).optional(),\n\tmax_values: z.number().min(0).max(25).optional(),\n\tcustom_id: customIdPredicate,\n\tdisabled: z.boolean().optional(),\n});\n\nexport const selectMenuChannelPredicate = selectMenuBasePredicate.extend({\n\ttype: z.literal(ComponentType.ChannelSelect),\n\tchannel_types: z.enum(ChannelType).array().optional(),\n\tdefault_values: z\n\t\t.object({ id: snowflakePredicate, type: z.literal(SelectMenuDefaultValueType.Channel) })\n\t\t.array()\n\t\t.max(25)\n\t\t.optional(),\n});\n\nexport const selectMenuMentionablePredicate = selectMenuBasePredicate.extend({\n\ttype: z.literal(ComponentType.MentionableSelect),\n\tdefault_values: z\n\t\t.object({\n\t\t\tid: snowflakePredicate,\n\t\t\ttype: z.literal([SelectMenuDefaultValueType.Role, SelectMenuDefaultValueType.User]),\n\t\t})\n\t\t.array()\n\t\t.max(25)\n\t\t.optional(),\n});\n\nexport const selectMenuRolePredicate = selectMenuBasePredicate.extend({\n\ttype: z.literal(ComponentType.RoleSelect),\n\tdefault_values: z\n\t\t.object({ id: snowflakePredicate, type: z.literal(SelectMenuDefaultValueType.Role) })\n\t\t.array()\n\t\t.max(25)\n\t\t.optional(),\n});\n\nexport const selectMenuStringOptionPredicate = z.object({\n\tlabel: z.string().min(1).max(100),\n\tvalue: z.string().min(1).max(100),\n\tdescription: z.string().min(1).max(100).optional(),\n\temoji: emojiPredicate.optional(),\n\tdefault: z.boolean().optional(),\n});\n\nexport const selectMenuStringPredicate = selectMenuBasePredicate\n\t.extend({\n\t\ttype: z.literal(ComponentType.StringSelect),\n\t\toptions: selectMenuStringOptionPredicate.array().min(1).max(25),\n\t})\n\t.check((ctx) => {\n\t\tconst addIssue = (name: string, minimum: number) =>\n\t\t\tctx.issues.push({\n\t\t\t\tcode: 'too_small',\n\t\t\t\tmessage: `The number of options must be greater than or equal to ${name}`,\n\t\t\t\tinclusive: true,\n\t\t\t\tminimum,\n\t\t\t\ttype: 'number',\n\t\t\t\tpath: ['options'],\n\t\t\t\torigin: 'number',\n\t\t\t\tinput: minimum,\n\t\t\t});\n\n\t\tif (ctx.value.min_values !== undefined && ctx.value.options.length < ctx.value.min_values) {\n\t\t\taddIssue('min_values', ctx.value.min_values);\n\t\t}\n\n\t\tif (\n\t\t\tctx.value.min_values !== undefined &&\n\t\t\tctx.value.max_values !== undefined &&\n\t\t\tctx.value.min_values > ctx.value.max_values\n\t\t) {\n\t\t\tctx.issues.push({\n\t\t\t\tcode: 'too_big',\n\t\t\t\tmessage: `The maximum amount of options must be greater than or equal to the minimum amount of options`,\n\t\t\t\tinclusive: true,\n\t\t\t\tmaximum: ctx.value.max_values,\n\t\t\t\ttype: 'number',\n\t\t\t\tpath: ['min_values'],\n\t\t\t\torigin: 'number',\n\t\t\t\tinput: ctx.value.min_values,\n\t\t\t});\n\t\t}\n\t});\n\nexport const selectMenuUserPredicate = selectMenuBasePredicate.extend({\n\ttype: z.literal(ComponentType.UserSelect),\n\tdefault_values: z\n\t\t.object({ id: snowflakePredicate, type: z.literal(SelectMenuDefaultValueType.User) })\n\t\t.array()\n\t\t.max(25)\n\t\t.optional(),\n});\n\nexport const actionRowPredicate = z.object({\n\tid: idPredicate,\n\ttype: z.literal(ComponentType.ActionRow),\n\tcomponents: z.union([\n\t\tz\n\t\t\t.object({ type: z.literal(ComponentType.Button) })\n\t\t\t.array()\n\t\t\t.min(1)\n\t\t\t.max(5),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal([\n\t\t\t\t\tComponentType.ChannelSelect,\n\t\t\t\t\tComponentType.MentionableSelect,\n\t\t\t\t\tComponentType.StringSelect,\n\t\t\t\t\tComponentType.RoleSelect,\n\t\t\t\t\tComponentType.TextInput,\n\t\t\t\t\tComponentType.UserSelect,\n\t\t\t\t]),\n\t\t\t})\n\t\t\t.array()\n\t\t\t.length(1),\n\t]),\n});\n","import { Locale } from 'discord-api-types/v10';\nimport { z } from 'zod';\n\nexport const idPredicate = z.int().min(0).max(2_147_483_647).optional();\nexport const customIdPredicate = z.string().min(1).max(100);\nexport const snowflakePredicate = z.string().regex(/^(?:0|[1-9]\\d*)$/);\n\nexport const memberPermissionsPredicate = z.coerce.bigint();\n\nexport const localeMapPredicate = z.strictObject(\n\tObject.fromEntries(Object.values(Locale).map((loc) => [loc, z.string().optional()])) as Record<\n\t\tLocale,\n\t\tz.ZodOptional<z.ZodString>\n\t>,\n);\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIBaseComponent, ComponentType } from 'discord-api-types/v10';\n\nexport interface ComponentBuilderBaseData {\n\tid?: number | undefined;\n}\n\n/**\n * The base component builder that contains common symbols for all sorts of components.\n *\n * @typeParam Component - The type of API data that is stored within the builder\n */\nexport abstract class ComponentBuilder<\n\tComponent extends APIBaseComponent<ComponentType>,\n> implements JSONEncodable<Component> {\n\t/**\n\t * @internal\n\t */\n\tprotected abstract readonly data: ComponentBuilderBaseData;\n\n\t/**\n\t * Sets the id of this component.\n\t *\n\t * @param id - The id to use\n\t */\n\tpublic setId(id: number) {\n\t\tthis.data.id = id;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the id of this component, defaulting to a default incremented id.\n\t */\n\tpublic clearId() {\n\t\tthis.data.id = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic abstract toJSON(validationOverride?: boolean): Component;\n}\n","import type { APIButtonComponent } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { buttonPredicate } from '../Assertions.js';\nimport { ComponentBuilder } from '../Component.js';\n\n/**\n * A builder that creates API-compatible JSON data for buttons.\n */\nexport abstract class BaseButtonBuilder<ButtonData extends APIButtonComponent> extends ComponentBuilder<ButtonData> {\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: Partial<ButtonData>;\n\n\t/**\n\t * Sets whether this button is disabled.\n\t *\n\t * @param disabled - Whether to disable this button\n\t */\n\tpublic setDisabled(disabled = true) {\n\t\tthis.data.disabled = disabled;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): ButtonData {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(buttonPredicate, clone, validationOverride);\n\n\t\treturn clone as ButtonData;\n\t}\n}\n","import { ButtonStyle, ComponentType, type APIButtonComponentWithCustomId } from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { BaseButtonBuilder } from './Button.js';\nimport { EmojiOrLabelButtonMixin } from './mixins/EmojiOrLabelButtonMixin.js';\n\nexport type CustomIdButtonStyle = APIButtonComponentWithCustomId['style'];\n\n/**\n * A builder that creates API-compatible JSON data for buttons with custom IDs.\n *\n * @mixes {@link BaseButtonBuilder}\\<{@link discord-api-types/v10#(APIButtonComponentWithCustomId:interface)}\\>\n * @mixes {@link EmojiOrLabelButtonMixin}\n */\nexport abstract class CustomIdButtonBuilder extends Mixin(\n\tBaseButtonBuilder<APIButtonComponentWithCustomId>,\n\tEmojiOrLabelButtonMixin,\n) {\n\tprotected override readonly data: Partial<APIButtonComponentWithCustomId>;\n\n\tprotected constructor(data: Partial<APIButtonComponentWithCustomId> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.Button };\n\t}\n\n\t/**\n\t * Sets the custom id for this button.\n\t *\n\t * @remarks\n\t * This method is only applicable to buttons that are not using the `Link` button style.\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customId;\n\t\treturn this;\n\t}\n}\n\n/**\n * A builder that creates API-compatible JSON data for buttons with custom IDs (using the primary style).\n */\nexport class PrimaryButtonBuilder extends CustomIdButtonBuilder {\n\tpublic constructor(data: Partial<APIButtonComponentWithCustomId> = {}) {\n\t\tsuper({ ...data, style: ButtonStyle.Primary });\n\t}\n}\n\n/**\n * A builder that creates API-compatible JSON data for buttons with custom IDs (using the secondary style).\n */\nexport class SecondaryButtonBuilder extends CustomIdButtonBuilder {\n\tpublic constructor(data: Partial<APIButtonComponentWithCustomId> = {}) {\n\t\tsuper({ ...data, style: ButtonStyle.Secondary });\n\t}\n}\n\n/**\n * A builder that creates API-compatible JSON data for buttons with custom IDs (using the success style).\n */\nexport class SuccessButtonBuilder extends CustomIdButtonBuilder {\n\tpublic constructor(data: Partial<APIButtonComponentWithCustomId> = {}) {\n\t\tsuper({ ...data, style: ButtonStyle.Success });\n\t}\n}\n\n/**\n * A builder that creates API-compatible JSON data for buttons with custom IDs (using the danger style).\n */\nexport class DangerButtonBuilder extends CustomIdButtonBuilder {\n\tpublic constructor(data: Partial<APIButtonComponentWithCustomId> = {}) {\n\t\tsuper({ ...data, style: ButtonStyle.Danger });\n\t}\n}\n","import {\n\tButtonStyle,\n\tComponentType,\n\ttype APIButtonComponent,\n\ttype APIButtonComponentWithURL,\n} from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { BaseButtonBuilder } from './Button.js';\nimport { EmojiOrLabelButtonMixin } from './mixins/EmojiOrLabelButtonMixin.js';\n\n/**\n * A builder that creates API-compatible JSON data for buttons with links.\n *\n * @mixes {@link BaseButtonBuilder}\\<{@link discord-api-types/v10#(APIButtonComponentWithURL:interface)}\\>\n * @mixes {@link EmojiOrLabelButtonMixin}\n */\nexport class LinkButtonBuilder extends Mixin(BaseButtonBuilder<APIButtonComponentWithURL>, EmojiOrLabelButtonMixin) {\n\tprotected override readonly data: Partial<APIButtonComponentWithURL>;\n\n\tpublic constructor(data: Partial<APIButtonComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.Button, style: ButtonStyle.Link };\n\t}\n\n\t/**\n\t * Sets the URL for this button.\n\t *\n\t * @remarks\n\t * This method is only available to buttons using the `Link` button style.\n\t * Only three types of URL schemes are currently supported: `https://`, `http://`, and `discord://`.\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.url = url;\n\t\treturn this;\n\t}\n}\n","import type { APIButtonComponentWithSKUId, Snowflake } from 'discord-api-types/v10';\nimport { ButtonStyle, ComponentType } from 'discord-api-types/v10';\nimport { BaseButtonBuilder } from './Button.js';\n\n/**\n * A builder that creates API-compatible JSON data for premium buttons.\n */\nexport class PremiumButtonBuilder extends BaseButtonBuilder<APIButtonComponentWithSKUId> {\n\tprotected override readonly data: Partial<APIButtonComponentWithSKUId>;\n\n\tpublic constructor(data: Partial<APIButtonComponentWithSKUId> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.Button, style: ButtonStyle.Premium };\n\t}\n\n\t/**\n\t * Sets the SKU id that represents a purchasable SKU for this button.\n\t *\n\t * @remarks Only available when using premium-style buttons.\n\t * @param skuId - The SKU id to use\n\t */\n\tpublic setSKUId(skuId: Snowflake) {\n\t\tthis.data.sku_id = skuId;\n\t\treturn this;\n\t}\n}\n","import type { APIFileUploadComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { fileUploadPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for file uploads.\n */\nexport class FileUploadBuilder extends ComponentBuilder<APIFileUploadComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: Partial<APIFileUploadComponent>;\n\n\t/**\n\t * Creates a new file upload.\n\t *\n\t * @param data - The API data to create this file upload with\n\t * @example\n\t * Creating a file upload from an API data object:\n\t * ```ts\n\t * const fileUpload = new FileUploadBuilder({\n\t * \tcustom_id: \"file_upload\",\n\t * min_values: 2,\n\t * max_values: 5,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a file upload using setters and API data:\n\t * ```ts\n\t * const fileUpload = new FileUploadBuilder({\n\t * \tcustom_id: \"file_upload\",\n\t * min_values: 2,\n\t * max_values: 5,\n\t * }).setRequired();\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIFileUploadComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.FileUpload };\n\t}\n\n\t/**\n\t * Sets the custom id for this file upload.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customId;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum number of file uploads required.\n\t *\n\t * @param minValues - The minimum values that must be uploaded\n\t */\n\tpublic setMinValues(minValues: number) {\n\t\tthis.data.min_values = minValues;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the minimum values.\n\t */\n\tpublic clearMinValues() {\n\t\tthis.data.min_values = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum number of file uploads required.\n\t *\n\t * @param maxValues - The maximum values that can be uploaded\n\t */\n\tpublic setMaxValues(maxValues: number) {\n\t\tthis.data.max_values = maxValues;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the maximum values.\n\t */\n\tpublic clearMaxValues() {\n\t\tthis.data.max_values = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this file upload is required.\n\t *\n\t * @param required - Whether this file upload is required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = required;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIFileUploadComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(fileUploadPredicate, clone, validationOverride);\n\n\t\treturn clone as APIFileUploadComponent;\n\t}\n}\n","import { ComponentType } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { customIdPredicate, idPredicate } from '../../Assertions';\n\nexport const fileUploadPredicate = z.object({\n\ttype: z.literal(ComponentType.FileUpload),\n\tid: idPredicate,\n\tcustom_id: customIdPredicate,\n\tmin_values: z.int().min(0).max(10).optional(),\n\tmax_values: z.int().min(1).max(10).optional(),\n\trequired: z.boolean().optional(),\n});\n","import type {\n\tAPIChannelSelectComponent,\n\tAPIFileUploadComponent,\n\tAPILabelComponent,\n\tAPIMentionableSelectComponent,\n\tAPIRoleSelectComponent,\n\tAPIStringSelectComponent,\n\tAPITextInputComponent,\n\tAPIUserSelectComponent,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { resolveBuilder } from '../../util/resolveBuilder.js';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { createComponentBuilder } from '../Components.js';\nimport { FileUploadBuilder } from '../fileUpload/FileUpload.js';\nimport { ChannelSelectMenuBuilder } from '../selectMenu/ChannelSelectMenu.js';\nimport { MentionableSelectMenuBuilder } from '../selectMenu/MentionableSelectMenu.js';\nimport { RoleSelectMenuBuilder } from '../selectMenu/RoleSelectMenu.js';\nimport { StringSelectMenuBuilder } from '../selectMenu/StringSelectMenu.js';\nimport { UserSelectMenuBuilder } from '../selectMenu/UserSelectMenu.js';\nimport { TextInputBuilder } from '../textInput/TextInput.js';\nimport { labelPredicate } from './Assertions.js';\n\nexport interface LabelBuilderData extends Partial<Omit<APILabelComponent, 'component'>> {\n\tcomponent?:\n\t\t| ChannelSelectMenuBuilder\n\t\t| FileUploadBuilder\n\t\t| MentionableSelectMenuBuilder\n\t\t| RoleSelectMenuBuilder\n\t\t| StringSelectMenuBuilder\n\t\t| TextInputBuilder\n\t\t| UserSelectMenuBuilder;\n}\n\n/**\n * A builder that creates API-compatible JSON data for labels.\n */\nexport class LabelBuilder extends ComponentBuilder<APILabelComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: LabelBuilderData;\n\n\t/**\n\t * Creates a new label.\n\t *\n\t * @param data - The API data to create this label with\n\t * @example\n\t * Creating a label from an API data object:\n\t * ```ts\n\t * const label = new LabelBuilder({\n\t * \tlabel: \"label\",\n\t * \tcomponent,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a label using setters and API data:\n\t * ```ts\n\t * const label = new LabelBuilder({\n\t * \tlabel: 'label',\n\t * \tcomponent,\n\t * }).setContent('new text');\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APILabelComponent> = {}) {\n\t\tsuper();\n\n\t\tconst { component, ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tcomponent: component ? createComponentBuilder(component) : undefined,\n\t\t\ttype: ComponentType.Label,\n\t\t};\n\t}\n\n\t/**\n\t * Sets the label for this label.\n\t *\n\t * @param label - The label to use\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = label;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description for this label.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = description;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description for this label.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a string select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setStringSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIStringSelectComponent\n\t\t\t| StringSelectMenuBuilder\n\t\t\t| ((builder: StringSelectMenuBuilder) => StringSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, StringSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a user select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setUserSelectMenuComponent(\n\t\tinput: APIUserSelectComponent | UserSelectMenuBuilder | ((builder: UserSelectMenuBuilder) => UserSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, UserSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a role select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setRoleSelectMenuComponent(\n\t\tinput: APIRoleSelectComponent | RoleSelectMenuBuilder | ((builder: RoleSelectMenuBuilder) => RoleSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, RoleSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a mentionable select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setMentionableSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIMentionableSelectComponent\n\t\t\t| MentionableSelectMenuBuilder\n\t\t\t| ((builder: MentionableSelectMenuBuilder) => MentionableSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, MentionableSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a channel select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setChannelSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIChannelSelectComponent\n\t\t\t| ChannelSelectMenuBuilder\n\t\t\t| ((builder: ChannelSelectMenuBuilder) => ChannelSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, ChannelSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a text input component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setTextInputComponent(\n\t\tinput: APITextInputComponent | TextInputBuilder | ((builder: TextInputBuilder) => TextInputBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, TextInputBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a file upload component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setFileUploadComponent(\n\t\tinput: APIFileUploadComponent | FileUploadBuilder | ((builder: FileUploadBuilder) => FileUploadBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, FileUploadBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APILabelComponent {\n\t\tconst { component, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\t// The label predicate validates the component.\n\t\t\tcomponent: component?.toJSON(false),\n\t\t};\n\n\t\tvalidate(labelPredicate, data, validationOverride);\n\n\t\treturn data as APILabelComponent;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\n\n/**\n * @privateRemarks\n * This is a type-guard util, because if you were to in-line `builder instanceof Constructor` in the `resolveBuilder`\n * function, TS doesn't narrow out the type `Builder`, causing a type error on the last return statement.\n * @internal\n */\nfunction isBuilder<Builder extends JSONEncodable<any>>(\n\tbuilder: unknown,\n\tConstructor: new () => Builder,\n): builder is Builder {\n\treturn builder instanceof Constructor;\n}\n\n/**\n * \"Resolves\" a builder from the 3 ways it can be input:\n * 1. A clean instance\n * 2. A data object that can be used to construct the builder\n * 3. A function that takes a builder and returns a builder e.g. `builder => builder.setFoo('bar')`\n *\n * @typeParam Builder - The builder type\n * @typeParam BuilderData - The data object that can be used to construct the builder\n * @param builder - The user input, as described in the function description\n * @param Constructor - The constructor of the builder\n */\nexport function resolveBuilder<Builder extends JSONEncodable<any>, BuilderData extends Record<PropertyKey, any>>(\n\tbuilder: Builder | BuilderData | ((builder: Builder) => Builder),\n\tConstructor: new (data?: BuilderData) => Builder,\n): Builder {\n\tif (isBuilder(builder, Constructor)) {\n\t\treturn builder;\n\t}\n\n\tif (typeof builder === 'function') {\n\t\treturn builder(new Constructor());\n\t}\n\n\treturn new Constructor(builder);\n}\n","import type {\n\tAPIBaseComponent,\n\tAPIButtonComponent,\n\tAPIMessageComponent,\n\tAPIModalComponent,\n\tAPISectionAccessoryComponent,\n} from 'discord-api-types/v10';\nimport { ButtonStyle, ComponentType } from 'discord-api-types/v10';\nimport { ActionRowBuilder } from './ActionRow.js';\nimport { ComponentBuilder } from './Component.js';\nimport type { BaseButtonBuilder } from './button/Button.js';\nimport {\n\tDangerButtonBuilder,\n\tPrimaryButtonBuilder,\n\tSecondaryButtonBuilder,\n\tSuccessButtonBuilder,\n} from './button/CustomIdButton.js';\nimport { LinkButtonBuilder } from './button/LinkButton.js';\nimport { PremiumButtonBuilder } from './button/PremiumButton.js';\nimport { FileUploadBuilder } from './fileUpload/FileUpload.js';\nimport { LabelBuilder } from './label/Label.js';\nimport { ChannelSelectMenuBuilder } from './selectMenu/ChannelSelectMenu.js';\nimport { MentionableSelectMenuBuilder } from './selectMenu/MentionableSelectMenu.js';\nimport { RoleSelectMenuBuilder } from './selectMenu/RoleSelectMenu.js';\nimport { StringSelectMenuBuilder } from './selectMenu/StringSelectMenu.js';\nimport { UserSelectMenuBuilder } from './selectMenu/UserSelectMenu.js';\nimport { TextInputBuilder } from './textInput/TextInput.js';\nimport { ContainerBuilder } from './v2/Container.js';\nimport { FileBuilder } from './v2/File.js';\nimport { MediaGalleryBuilder } from './v2/MediaGallery.js';\nimport { SectionBuilder } from './v2/Section.js';\nimport { SeparatorBuilder } from './v2/Separator.js';\nimport { TextDisplayBuilder } from './v2/TextDisplay.js';\nimport { ThumbnailBuilder } from './v2/Thumbnail.js';\n\n/**\n * The builders that may be used as top-level components on messages\n */\nexport type MessageTopLevelComponentBuilder =\n\t| ActionRowBuilder\n\t| ContainerBuilder\n\t| FileBuilder\n\t| MediaGalleryBuilder\n\t| SectionBuilder\n\t| SeparatorBuilder\n\t| TextDisplayBuilder;\n\n/**\n * The builders that may be used for messages.\n */\nexport type MessageComponentBuilder =\n\t| MessageActionRowComponentBuilder\n\t| MessageTopLevelComponentBuilder\n\t| ThumbnailBuilder;\n\n/**\n * The builders that may be used for modals.\n */\nexport type ModalComponentBuilder =\n\t| ActionRowBuilder\n\t| FileUploadBuilder\n\t| LabelBuilder\n\t| ModalActionRowComponentBuilder;\n\n/**\n * Any button builder\n */\nexport type ButtonBuilder =\n\t| DangerButtonBuilder\n\t| LinkButtonBuilder\n\t| PremiumButtonBuilder\n\t| PrimaryButtonBuilder\n\t| SecondaryButtonBuilder\n\t| SuccessButtonBuilder;\n\n/**\n * The builders that may be used within an action row for messages.\n */\nexport type MessageActionRowComponentBuilder =\n\t| ButtonBuilder\n\t| ChannelSelectMenuBuilder\n\t| MentionableSelectMenuBuilder\n\t| RoleSelectMenuBuilder\n\t| StringSelectMenuBuilder\n\t| UserSelectMenuBuilder;\n\n/**\n * The builders that may be used within an action row for modals.\n */\nexport type ModalActionRowComponentBuilder = TextInputBuilder;\n\n/**\n * Any action row component builder.\n */\nexport type AnyActionRowComponentBuilder = MessageActionRowComponentBuilder | ModalActionRowComponentBuilder;\n\n/**\n * Any modal component builder.\n */\nexport type AnyModalComponentBuilder = FileUploadBuilder | LabelBuilder | TextDisplayBuilder;\n\n/**\n * Components here are mapped to their respective builder.\n */\nexport interface MappedComponentTypes {\n\t/**\n\t * The action row component type is associated with an {@link ActionRowBuilder}.\n\t */\n\t[ComponentType.ActionRow]: ActionRowBuilder;\n\t/**\n\t * The button component type is associated with a {@link BaseButtonBuilder}.\n\t */\n\t[ComponentType.Button]: ButtonBuilder;\n\t/**\n\t * The string select component type is associated with a {@link StringSelectMenuBuilder}.\n\t */\n\t[ComponentType.StringSelect]: StringSelectMenuBuilder;\n\t/**\n\t * The text input component type is associated with a {@link TextInputBuilder}.\n\t */\n\t[ComponentType.TextInput]: TextInputBuilder;\n\t/**\n\t * The user select component type is associated with a {@link UserSelectMenuBuilder}.\n\t */\n\t[ComponentType.UserSelect]: UserSelectMenuBuilder;\n\t/**\n\t * The role select component type is associated with a {@link RoleSelectMenuBuilder}.\n\t */\n\t[ComponentType.RoleSelect]: RoleSelectMenuBuilder;\n\t/**\n\t * The mentionable select component type is associated with a {@link MentionableSelectMenuBuilder}.\n\t */\n\t[ComponentType.MentionableSelect]: MentionableSelectMenuBuilder;\n\t/**\n\t * The channel select component type is associated with a {@link ChannelSelectMenuBuilder}.\n\t */\n\t[ComponentType.ChannelSelect]: ChannelSelectMenuBuilder;\n\t/**\n\t * The thumbnail component type is associated with a {@link ThumbnailBuilder}.\n\t */\n\t[ComponentType.Thumbnail]: ThumbnailBuilder;\n\t/**\n\t * The file component type is associated with a {@link FileBuilder}.\n\t */\n\t[ComponentType.File]: FileBuilder;\n\t/**\n\t * The separator component type is associated with a {@link SeparatorBuilder}.\n\t */\n\t[ComponentType.Separator]: SeparatorBuilder;\n\t/**\n\t * The text display component type is associated with a {@link TextDisplayBuilder}.\n\t */\n\t[ComponentType.TextDisplay]: TextDisplayBuilder;\n\t/**\n\t * The media gallery component type is associated with a {@link MediaGalleryBuilder}.\n\t */\n\t[ComponentType.MediaGallery]: MediaGalleryBuilder;\n\t/**\n\t * The section component type is associated with a {@link SectionBuilder}.\n\t */\n\t[ComponentType.Section]: SectionBuilder;\n\t/**\n\t * The container component type is associated with a {@link ContainerBuilder}.\n\t */\n\t[ComponentType.Container]: ContainerBuilder;\n\t/**\n\t * The label component type is associated with a {@link LabelBuilder}.\n\t */\n\t[ComponentType.Label]: LabelBuilder;\n\t/**\n\t * The file upload component type is associated with a {@link FileUploadBuilder}.\n\t */\n\t[ComponentType.FileUpload]: FileUploadBuilder;\n}\n\n/**\n * Factory for creating components from API data.\n *\n * @typeParam ComponentType - The type of component to use\n * @param data - The API data to transform to a component class\n */\nexport function createComponentBuilder<ComponentType extends keyof MappedComponentTypes>(\n\t// eslint-disable-next-line @typescript-eslint/sort-type-constituents\n\tdata: (APIModalComponent | APIMessageComponent) & { type: ComponentType },\n): MappedComponentTypes[ComponentType];\n\n/**\n * Factory for creating components from API data.\n *\n * @typeParam ComponentBuilder - The type of component to use\n * @param data - The API data to transform to a component class\n */\nexport function createComponentBuilder<ComponentBuilder extends MessageComponentBuilder | ModalComponentBuilder>(\n\tdata: ComponentBuilder,\n): ComponentBuilder;\n\nexport function createComponentBuilder(\n\tdata: APIMessageComponent | APIModalComponent | MessageComponentBuilder,\n): ComponentBuilder<APIBaseComponent<ComponentType>> {\n\tif (data instanceof ComponentBuilder) {\n\t\treturn data;\n\t}\n\n\tswitch (data.type) {\n\t\tcase ComponentType.ActionRow:\n\t\t\treturn new ActionRowBuilder(data);\n\t\tcase ComponentType.Button:\n\t\t\treturn createButtonBuilder(data);\n\t\tcase ComponentType.StringSelect:\n\t\t\treturn new StringSelectMenuBuilder(data);\n\t\tcase ComponentType.TextInput:\n\t\t\treturn new TextInputBuilder(data);\n\t\tcase ComponentType.UserSelect:\n\t\t\treturn new UserSelectMenuBuilder(data);\n\t\tcase ComponentType.RoleSelect:\n\t\t\treturn new RoleSelectMenuBuilder(data);\n\t\tcase ComponentType.MentionableSelect:\n\t\t\treturn new MentionableSelectMenuBuilder(data);\n\t\tcase ComponentType.ChannelSelect:\n\t\t\treturn new ChannelSelectMenuBuilder(data);\n\t\tcase ComponentType.Thumbnail:\n\t\t\treturn new ThumbnailBuilder(data);\n\t\tcase ComponentType.File:\n\t\t\treturn new FileBuilder(data);\n\t\tcase ComponentType.Separator:\n\t\t\treturn new SeparatorBuilder(data);\n\t\tcase ComponentType.TextDisplay:\n\t\t\treturn new TextDisplayBuilder(data);\n\t\tcase ComponentType.MediaGallery:\n\t\t\treturn new MediaGalleryBuilder(data);\n\t\tcase ComponentType.Section:\n\t\t\treturn new SectionBuilder(data);\n\t\tcase ComponentType.Container:\n\t\t\treturn new ContainerBuilder(data);\n\t\tcase ComponentType.Label:\n\t\t\treturn new LabelBuilder(data);\n\t\tcase ComponentType.FileUpload:\n\t\t\treturn new FileUploadBuilder(data);\n\t\tdefault:\n\t\t\t// @ts-expect-error This case can still occur if we get a newer unsupported component type\n\t\t\tthrow new Error(`Cannot properly serialize component type: ${data.type}`);\n\t}\n}\n\nfunction createButtonBuilder(data: APIButtonComponent): ButtonBuilder {\n\tswitch (data.style) {\n\t\tcase ButtonStyle.Primary:\n\t\t\treturn new PrimaryButtonBuilder(data);\n\t\tcase ButtonStyle.Secondary:\n\t\t\treturn new SecondaryButtonBuilder(data);\n\t\tcase ButtonStyle.Success:\n\t\t\treturn new SuccessButtonBuilder(data);\n\t\tcase ButtonStyle.Danger:\n\t\t\treturn new DangerButtonBuilder(data);\n\t\tcase ButtonStyle.Link:\n\t\t\treturn new LinkButtonBuilder(data);\n\t\tcase ButtonStyle.Premium:\n\t\t\treturn new PremiumButtonBuilder(data);\n\t\tdefault:\n\t\t\t// @ts-expect-error This case can still occur if we get a newer unsupported button style\n\t\t\tthrow new Error(`Cannot properly serialize button with style: ${data.style}`);\n\t}\n}\n\nexport function resolveAccessoryComponent(component: APISectionAccessoryComponent) {\n\tswitch (component.type) {\n\t\tcase ComponentType.Button:\n\t\t\treturn createButtonBuilder(component);\n\t\tcase ComponentType.Thumbnail:\n\t\t\treturn new ThumbnailBuilder(component);\n\t\tdefault:\n\t\t\t// @ts-expect-error This case can still occur if we get a newer unsupported component type\n\t\t\tthrow new Error(`Cannot properly serialize section accessory component: ${component.type}`);\n\t}\n}\n","import type {\n\tAPITextInputComponent,\n\tAPIActionRowComponent,\n\tAPIComponentInActionRow,\n\tAPIChannelSelectComponent,\n\tAPIMentionableSelectComponent,\n\tAPIRoleSelectComponent,\n\tAPIStringSelectComponent,\n\tAPIUserSelectComponent,\n\tAPIButtonComponentWithCustomId,\n\tAPIButtonComponentWithSKUId,\n\tAPIButtonComponentWithURL,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../util/normalizeArray.js';\nimport { resolveBuilder } from '../util/resolveBuilder.js';\nimport { validate } from '../util/validation.js';\nimport { actionRowPredicate } from './Assertions.js';\nimport { ComponentBuilder } from './Component.js';\nimport type { AnyActionRowComponentBuilder } from './Components.js';\nimport { createComponentBuilder } from './Components.js';\nimport {\n\tDangerButtonBuilder,\n\tPrimaryButtonBuilder,\n\tSecondaryButtonBuilder,\n\tSuccessButtonBuilder,\n} from './button/CustomIdButton.js';\nimport { LinkButtonBuilder } from './button/LinkButton.js';\nimport { PremiumButtonBuilder } from './button/PremiumButton.js';\nimport { ChannelSelectMenuBuilder } from './selectMenu/ChannelSelectMenu.js';\nimport { MentionableSelectMenuBuilder } from './selectMenu/MentionableSelectMenu.js';\nimport { RoleSelectMenuBuilder } from './selectMenu/RoleSelectMenu.js';\nimport { StringSelectMenuBuilder } from './selectMenu/StringSelectMenu.js';\nimport { UserSelectMenuBuilder } from './selectMenu/UserSelectMenu.js';\nimport { TextInputBuilder } from './textInput/TextInput.js';\n\nexport interface ActionRowBuilderData extends Partial<\n\tOmit<APIActionRowComponent<APIComponentInActionRow>, 'components'>\n> {\n\tcomponents: AnyActionRowComponentBuilder[];\n}\n\n/**\n * A builder that creates API-compatible JSON data for action rows.\n */\nexport class ActionRowBuilder extends ComponentBuilder<APIActionRowComponent<APIComponentInActionRow>> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: ActionRowBuilderData;\n\n\t/**\n\t * The components within this action row.\n\t */\n\tpublic get components(): readonly AnyActionRowComponentBuilder[] {\n\t\treturn this.data.components;\n\t}\n\n\t/**\n\t * Creates a new action row.\n\t *\n\t * @param data - The API data to create this action row with\n\t * @example\n\t * Creating an action row from an API data object:\n\t * ```ts\n\t * const actionRow = new ActionRowBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcustom_id: \"custom id\",\n\t * \t\t\tlabel: \"Type something\",\n\t * \t\t\tstyle: TextInputStyle.Short,\n\t * \t\t\ttype: ComponentType.TextInput,\n\t * \t\t},\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating an action row using setters and API data:\n\t * ```ts\n\t * const actionRow = new ActionRowBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcustom_id: \"custom id\",\n\t * \t\t\tlabel: \"Click me\",\n\t * \t\t\tstyle: ButtonStyle.Primary,\n\t * \t\t\ttype: ComponentType.Button,\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.addComponents(button2, button3);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIActionRowComponent<APIComponentInActionRow>> = {}) {\n\t\tsuper();\n\n\t\tconst { components = [], ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tcomponents: components.map((component) => createComponentBuilder(component)),\n\t\t\ttype: ComponentType.ActionRow,\n\t\t};\n\t}\n\n\t/**\n\t * Adds primary button components to this action row.\n\t *\n\t * @param input - The buttons to add\n\t */\n\tpublic addPrimaryButtonComponents(\n\t\t...input: RestOrArray<\n\t\t\tAPIButtonComponentWithCustomId | PrimaryButtonBuilder | ((builder: PrimaryButtonBuilder) => PrimaryButtonBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, PrimaryButtonBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds secondary button components to this action row.\n\t *\n\t * @param input - The buttons to add\n\t */\n\tpublic addSecondaryButtonComponents(\n\t\t...input: RestOrArray<\n\t\t\t| APIButtonComponentWithCustomId\n\t\t\t| SecondaryButtonBuilder\n\t\t\t| ((builder: SecondaryButtonBuilder) => SecondaryButtonBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, SecondaryButtonBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds success button components to this action row.\n\t *\n\t * @param input - The buttons to add\n\t */\n\tpublic addSuccessButtonComponents(\n\t\t...input: RestOrArray<\n\t\t\tAPIButtonComponentWithCustomId | SuccessButtonBuilder | ((builder: SuccessButtonBuilder) => SuccessButtonBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, SuccessButtonBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds danger button components to this action row.\n\t */\n\tpublic addDangerButtonComponents(\n\t\t...input: RestOrArray<\n\t\t\tAPIButtonComponentWithCustomId | DangerButtonBuilder | ((builder: DangerButtonBuilder) => DangerButtonBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, DangerButtonBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Generically add any type of component to this action row, only takes in an instance of a component builder.\n\t */\n\tpublic addComponents(...input: RestOrArray<AnyActionRowComponentBuilder>): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tthis.data.components.push(...normalized);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds SKU id button components to this action row.\n\t *\n\t * @param input - The buttons to add\n\t */\n\tpublic addPremiumButtonComponents(\n\t\t...input: RestOrArray<\n\t\t\tAPIButtonComponentWithSKUId | PremiumButtonBuilder | ((builder: PremiumButtonBuilder) => PremiumButtonBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, PremiumButtonBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds URL button components to this action row.\n\t *\n\t * @param input - The buttons to add\n\t */\n\tpublic addLinkButtonComponents(\n\t\t...input: RestOrArray<\n\t\t\tAPIButtonComponentWithURL | LinkButtonBuilder | ((builder: LinkButtonBuilder) => LinkButtonBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, LinkButtonBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a channel select menu component to this action row.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic addChannelSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIChannelSelectComponent\n\t\t\t| ChannelSelectMenuBuilder\n\t\t\t| ((builder: ChannelSelectMenuBuilder) => ChannelSelectMenuBuilder),\n\t): this {\n\t\tthis.data.components.push(resolveBuilder(input, ChannelSelectMenuBuilder));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a mentionable select menu component to this action row.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic addMentionableSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIMentionableSelectComponent\n\t\t\t| MentionableSelectMenuBuilder\n\t\t\t| ((builder: MentionableSelectMenuBuilder) => MentionableSelectMenuBuilder),\n\t): this {\n\t\tthis.data.components.push(resolveBuilder(input, MentionableSelectMenuBuilder));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a role select menu component to this action row.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic addRoleSelectMenuComponent(\n\t\tinput: APIRoleSelectComponent | RoleSelectMenuBuilder | ((builder: RoleSelectMenuBuilder) => RoleSelectMenuBuilder),\n\t): this {\n\t\tthis.data.components.push(resolveBuilder(input, RoleSelectMenuBuilder));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a string select menu component to this action row.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic addStringSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIStringSelectComponent\n\t\t\t| StringSelectMenuBuilder\n\t\t\t| ((builder: StringSelectMenuBuilder) => StringSelectMenuBuilder),\n\t): this {\n\t\tthis.data.components.push(resolveBuilder(input, StringSelectMenuBuilder));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a user select menu component to this action row.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic addUserSelectMenuComponent(\n\t\tinput: APIUserSelectComponent | UserSelectMenuBuilder | ((builder: UserSelectMenuBuilder) => UserSelectMenuBuilder),\n\t): this {\n\t\tthis.data.components.push(resolveBuilder(input, UserSelectMenuBuilder));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a text input component to this action row.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic addTextInputComponent(\n\t\tinput: APITextInputComponent | TextInputBuilder | ((builder: TextInputBuilder) => TextInputBuilder),\n\t): this {\n\t\tthis.data.components.push(resolveBuilder(input, TextInputBuilder));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts components for this action row.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing components of an action row.\n\t * @example\n\t * Remove the first component:\n\t * ```ts\n\t * actionRow.spliceComponents(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n components:\n\t * ```ts\n\t * const n = 4;\n\t * actionRow.spliceComponents(0, n);\n\t * ```\n\t * @example\n\t * Remove the last component:\n\t * ```ts\n\t * actionRow.spliceComponents(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of components to remove\n\t * @param components - The replacing component objects\n\t */\n\tpublic spliceComponents(index: number, deleteCount: number, ...components: AnyActionRowComponentBuilder[]): this {\n\t\tthis.data.components.splice(index, deleteCount, ...components);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIActionRowComponent<APIComponentInActionRow> {\n\t\tconst { components, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\tcomponents: components.map((component) => component.toJSON(validationOverride)),\n\t\t};\n\n\t\tvalidate(actionRowPredicate, data, validationOverride);\n\n\t\treturn data as APIActionRowComponent<APIComponentInActionRow>;\n\t}\n}\n","/**\n * Normalizes data that is a rest parameter or an array into an array with a depth of 1.\n *\n * @typeParam ItemType - The data that must satisfy {@link RestOrArray}.\n * @param arr - The (possibly variadic) data to normalize\n */\nexport function normalizeArray<ItemType>(arr: RestOrArray<ItemType>): ItemType[] {\n\tif (Array.isArray(arr[0])) return [...arr[0]];\n\treturn arr as ItemType[];\n}\n\n/**\n * Represents data that may be an array or came from a rest parameter.\n *\n * @remarks\n * This type is used throughout builders to ensure both an array and variadic arguments\n * may be used. It is normalized with {@link normalizeArray}.\n */\nexport type RestOrArray<Type> = Type[] | [Type[]];\n","import {\n\ttype APIChannelSelectComponent,\n\ttype ChannelType,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { validate } from '../../util/validation.js';\nimport { selectMenuChannelPredicate } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for channel select menus.\n */\nexport class ChannelSelectMenuBuilder extends BaseSelectMenuBuilder<APIChannelSelectComponent> {\n\tprotected override readonly data: Partial<APIChannelSelectComponent>;\n\n\t/**\n\t * Creates a new channel select menu.\n\t *\n\t * @param data - The API data to create this channel select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new ChannelSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new ChannelSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.addChannelTypes(ChannelType.GuildText, ChannelType.GuildAnnouncement)\n\t * \t.setMinValues(2);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIChannelSelectComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.ChannelSelect };\n\t}\n\n\t/**\n\t * Adds channel types to this select menu.\n\t *\n\t * @param types - The channel types to use\n\t */\n\tpublic addChannelTypes(...types: RestOrArray<ChannelType>) {\n\t\tconst normalizedTypes = normalizeArray(types);\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.push(...normalizedTypes);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets channel types for this select menu.\n\t *\n\t * @param types - The channel types to use\n\t */\n\tpublic setChannelTypes(...types: RestOrArray<ChannelType>) {\n\t\tconst normalizedTypes = normalizeArray(types);\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.splice(0, this.data.channel_types.length, ...normalizedTypes);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default channels to this auto populated select menu.\n\t *\n\t * @param channels - The channels to add\n\t */\n\tpublic addDefaultChannels(...channels: RestOrArray<Snowflake>) {\n\t\tconst normalizedValues = normalizeArray(channels);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Channel as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default channels for this auto populated select menu.\n\t *\n\t * @param channels - The channels to set\n\t */\n\tpublic setDefaultChannels(...channels: RestOrArray<Snowflake>) {\n\t\tconst normalizedValues = normalizeArray(channels);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.Channel as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIChannelSelectComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(selectMenuChannelPredicate, clone, validationOverride);\n\n\t\treturn clone as APIChannelSelectComponent;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APISelectMenuComponent } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component.js';\n\n/**\n * The base select menu builder that contains common symbols for select menu builders.\n *\n * @typeParam Data - The type of API data that is stored within the builder\n */\nexport abstract class BaseSelectMenuBuilder<Data extends APISelectMenuComponent>\n\textends ComponentBuilder<Data>\n\timplements JSONEncodable<APISelectMenuComponent>\n{\n\t/**\n\t * @internal\n\t */\n\tprotected abstract override readonly data: Partial<\n\t\tPick<Data, 'custom_id' | 'disabled' | 'id' | 'max_values' | 'min_values' | 'placeholder' | 'required'>\n\t>;\n\n\t/**\n\t * Sets the placeholder for this select menu.\n\t *\n\t * @param placeholder - The placeholder to use\n\t */\n\tpublic setPlaceholder(placeholder: string) {\n\t\tthis.data.placeholder = placeholder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the placeholder for this select menu.\n\t */\n\tpublic clearPlaceholder() {\n\t\tthis.data.placeholder = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum values that must be selected in the select menu.\n\t *\n\t * @param minValues - The minimum values that must be selected\n\t */\n\tpublic setMinValues(minValues: number) {\n\t\tthis.data.min_values = minValues;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum values that can be selected in the select menu.\n\t *\n\t * @param maxValues - The maximum values that can be selected\n\t */\n\tpublic setMaxValues(maxValues: number) {\n\t\tthis.data.max_values = maxValues;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom id for this select menu.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customId;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this select menu is disabled.\n\t *\n\t * @param disabled - Whether this select menu is disabled\n\t */\n\tpublic setDisabled(disabled = true) {\n\t\tthis.data.disabled = disabled;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this select menu is required.\n\t *\n\t * @remarks Only for use in modals.\n\t * @param required - Whether this string select menu is required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = required;\n\t\treturn this;\n\t}\n}\n","import {\n\ttype APIMentionableSelectComponent,\n\ttype APISelectMenuDefaultValue,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { validate } from '../../util/validation.js';\nimport { selectMenuMentionablePredicate } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for mentionable select menus.\n */\nexport class MentionableSelectMenuBuilder extends BaseSelectMenuBuilder<APIMentionableSelectComponent> {\n\tprotected override readonly data: Partial<APIMentionableSelectComponent>;\n\n\t/**\n\t * Creates a new mentionable select menu.\n\t *\n\t * @param data - The API data to create this mentionable select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new MentionableSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new MentionableSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIMentionableSelectComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.MentionableSelect };\n\t}\n\n\t/**\n\t * Adds default roles to this auto populated select menu.\n\t *\n\t * @param roles - The roles to add\n\t */\n\tpublic addDefaultRoles(...roles: RestOrArray<Snowflake>) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default users to this auto populated select menu.\n\t *\n\t * @param users - The users to add\n\t */\n\tpublic addDefaultUsers(...users: RestOrArray<Snowflake>) {\n\t\tconst normalizedValues = normalizeArray(users);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default values to this auto populated select menu.\n\t *\n\t * @param values - The values to add\n\t */\n\tpublic addDefaultValues(\n\t\t...values: RestOrArray<\n\t\t\t| APISelectMenuDefaultValue<SelectMenuDefaultValueType.Role>\n\t\t\t| APISelectMenuDefaultValue<SelectMenuDefaultValueType.User>\n\t\t>\n\t) {\n\t\tconst normalizedValues = normalizeArray(values);\n\t\tthis.data.default_values ??= [];\n\t\tthis.data.default_values.push(...normalizedValues);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default values for this auto populated select menu.\n\t *\n\t * @param values - The values to set\n\t */\n\tpublic setDefaultValues(\n\t\t...values: RestOrArray<\n\t\t\t| APISelectMenuDefaultValue<SelectMenuDefaultValueType.Role>\n\t\t\t| APISelectMenuDefaultValue<SelectMenuDefaultValueType.User>\n\t\t>\n\t) {\n\t\tconst normalizedValues = normalizeArray(values);\n\t\tthis.data.default_values = normalizedValues;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIMentionableSelectComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(selectMenuMentionablePredicate, clone, validationOverride);\n\n\t\treturn clone as APIMentionableSelectComponent;\n\t}\n}\n","import {\n\ttype APIRoleSelectComponent,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { validate } from '../../util/validation.js';\nimport { selectMenuRolePredicate } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for role select menus.\n */\nexport class RoleSelectMenuBuilder extends BaseSelectMenuBuilder<APIRoleSelectComponent> {\n\tprotected override readonly data: Partial<APIRoleSelectComponent>;\n\n\t/**\n\t * Creates a new role select menu.\n\t *\n\t * @param data - The API data to create this role select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new RoleSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new RoleSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIRoleSelectComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.RoleSelect };\n\t}\n\n\t/**\n\t * Adds default roles to this auto populated select menu.\n\t *\n\t * @param roles - The roles to add\n\t */\n\tpublic addDefaultRoles(...roles: RestOrArray<Snowflake>) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default roles for this auto populated select menu.\n\t *\n\t * @param roles - The roles to set\n\t */\n\tpublic setDefaultRoles(...roles: RestOrArray<Snowflake>) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIRoleSelectComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(selectMenuRolePredicate, clone, validationOverride);\n\n\t\treturn clone as APIRoleSelectComponent;\n\t}\n}\n","import { ComponentType } from 'discord-api-types/v10';\nimport type { APIStringSelectComponent, APISelectMenuOption } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../util/resolveBuilder.js';\nimport { validate } from '../../util/validation.js';\nimport { selectMenuStringPredicate } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\nimport { StringSelectMenuOptionBuilder } from './StringSelectMenuOption.js';\n\nexport interface StringSelectMenuData extends Partial<Omit<APIStringSelectComponent, 'options'>> {\n\toptions: StringSelectMenuOptionBuilder[];\n\trequired?: boolean;\n}\n\n/**\n * A builder that creates API-compatible JSON data for string select menus.\n */\nexport class StringSelectMenuBuilder extends BaseSelectMenuBuilder<APIStringSelectComponent> {\n\tprotected override readonly data: StringSelectMenuData;\n\n\t/**\n\t * The options for this select menu.\n\t */\n\tpublic get options(): readonly StringSelectMenuOptionBuilder[] {\n\t\treturn this.data.options;\n\t}\n\n\t/**\n\t * Creates a new string select menu.\n\t *\n\t * @param data - The API data to create this string select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new StringSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * \toptions: [\n\t * \t\t{ label: 'option 1', value: '1' },\n\t * \t\t{ label: 'option 2', value: '2' },\n\t * \t\t{ label: 'option 3', value: '3' },\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new StringSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1)\n\t * \t.addOptions({\n\t * \t\tlabel: 'Catchy',\n\t * \t\tvalue: 'catch',\n\t * \t});\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIStringSelectComponent> = {}) {\n\t\tsuper();\n\n\t\tconst { options = [], ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\toptions: options.map((option) => new StringSelectMenuOptionBuilder(option)),\n\t\t\ttype: ComponentType.StringSelect,\n\t\t};\n\t}\n\n\t/**\n\t * Adds options to this select menu.\n\t *\n\t * @param options - The options to add\n\t */\n\tpublic addOptions(\n\t\t...options: RestOrArray<\n\t\t\t| APISelectMenuOption\n\t\t\t| StringSelectMenuOptionBuilder\n\t\t\t| ((builder: StringSelectMenuOptionBuilder) => StringSelectMenuOptionBuilder)\n\t\t>\n\t) {\n\t\tconst normalizedOptions = normalizeArray(options);\n\t\tconst resolved = normalizedOptions.map((option) => resolveBuilder(option, StringSelectMenuOptionBuilder));\n\n\t\tthis.data.options.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the options for this select menu.\n\t *\n\t * @param options - The options to set\n\t */\n\tpublic setOptions(\n\t\t...options: RestOrArray<\n\t\t\t| APISelectMenuOption\n\t\t\t| StringSelectMenuOptionBuilder\n\t\t\t| ((builder: StringSelectMenuOptionBuilder) => StringSelectMenuOptionBuilder)\n\t\t>\n\t) {\n\t\treturn this.spliceOptions(0, this.options.length, ...normalizeArray(options));\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts options for this select menu.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | Array.prototype.splice()}.\n\t * It's useful for modifying and adjusting the order of existing options.\n\t * @example\n\t * Remove the first option:\n\t * ```ts\n\t * selectMenu.spliceOptions(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n option:\n\t * ```ts\n\t * const n = 4;\n\t * selectMenu.spliceOptions(0, n);\n\t * ```\n\t * @example\n\t * Remove the last option:\n\t * ```ts\n\t * selectMenu.spliceOptions(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of options to remove\n\t * @param options - The replacing option objects or builders\n\t */\n\tpublic spliceOptions(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...options: (\n\t\t\t| APISelectMenuOption\n\t\t\t| StringSelectMenuOptionBuilder\n\t\t\t| ((builder: StringSelectMenuOptionBuilder) => StringSelectMenuOptionBuilder)\n\t\t)[]\n\t) {\n\t\tconst resolved = options.map((option) => resolveBuilder(option, StringSelectMenuOptionBuilder));\n\n\t\tthis.data.options ??= [];\n\t\tthis.data.options.splice(index, deleteCount, ...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIStringSelectComponent {\n\t\tconst { options, ...rest } = this.data;\n\t\tconst data = {\n\t\t\t...(structuredClone(rest) as APIStringSelectComponent),\n\t\t\t// selectMenuStringPredicate covers the validation of options\n\t\t\toptions: options.map((option) => option.toJSON(false)),\n\t\t};\n\n\t\tvalidate(selectMenuStringPredicate, data, validationOverride);\n\n\t\treturn data as APIStringSelectComponent;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIMessageComponentEmoji, APISelectMenuOption } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { selectMenuStringOptionPredicate } from '../Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for string select menu options.\n */\nexport class StringSelectMenuOptionBuilder implements JSONEncodable<APISelectMenuOption> {\n\tprivate readonly data: Partial<APISelectMenuOption>;\n\n\t/**\n\t * Creates a new string select menu option.\n\t *\n\t * @param data - The API data to create this string select menu option with\n\t * @example\n\t * Creating a string select menu option from an API data object:\n\t * ```ts\n\t * const selectMenuOption = new SelectMenuOptionBuilder({\n\t * \tlabel: 'catchy label',\n\t * \tvalue: '1',\n\t * });\n\t * ```\n\t * @example\n\t * Creating a string select menu option using setters and API data:\n\t * ```ts\n\t * const selectMenuOption = new SelectMenuOptionBuilder({\n\t * \tdefault: true,\n\t * \tvalue: '1',\n\t * })\n\t * \t.setLabel('woah');\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APISelectMenuOption> = {}) {\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * Sets the label for this option.\n\t *\n\t * @param label - The label to use\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = label;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value for this option.\n\t *\n\t * @param value - The value to use\n\t */\n\tpublic setValue(value: string) {\n\t\tthis.data.value = value;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description for this option.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = description;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description for this option.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this option is selected by default.\n\t *\n\t * @param isDefault - Whether this option is selected by default\n\t */\n\tpublic setDefault(isDefault = true) {\n\t\tthis.data.default = isDefault;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the emoji to display for this option.\n\t *\n\t * @param emoji - The emoji to use\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\tthis.data.emoji = emoji;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the emoji for this option.\n\t */\n\tpublic clearEmoji() {\n\t\tthis.data.emoji = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(validationOverride?: boolean): APISelectMenuOption {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(selectMenuStringOptionPredicate, clone, validationOverride);\n\n\t\treturn clone as APISelectMenuOption;\n\t}\n}\n","import {\n\ttype APIUserSelectComponent,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { validate } from '../../util/validation.js';\nimport { selectMenuUserPredicate } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for user select menus.\n */\nexport class UserSelectMenuBuilder extends BaseSelectMenuBuilder<APIUserSelectComponent> {\n\tprotected override readonly data: Partial<APIUserSelectComponent>;\n\n\t/**\n\t * Creates a new user select menu.\n\t *\n\t * @param data - The API data to create this user select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new UserSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new UserSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIUserSelectComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.UserSelect };\n\t}\n\n\t/**\n\t * Adds default users to this auto populated select menu.\n\t *\n\t * @param users - The users to add\n\t */\n\tpublic addDefaultUsers(...users: RestOrArray<Snowflake>) {\n\t\tconst normalizedValues = normalizeArray(users);\n\n\t\tthis.data.default_values ??= [];\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default users for this auto populated select menu.\n\t *\n\t * @param users - The users to set\n\t */\n\tpublic setDefaultUsers(...users: RestOrArray<Snowflake>) {\n\t\tconst normalizedValues = normalizeArray(users);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIUserSelectComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(selectMenuUserPredicate, clone, validationOverride);\n\n\t\treturn clone as APIUserSelectComponent;\n\t}\n}\n","import { ComponentType, type TextInputStyle, type APITextInputComponent } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { textInputPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for text inputs.\n */\nexport class TextInputBuilder extends ComponentBuilder<APITextInputComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: Partial<APITextInputComponent>;\n\n\t/**\n\t * Creates a new text input.\n\t *\n\t * @param data - The API data to create this text input with\n\t * @example\n\t * Creating a text input from an API data object:\n\t * ```ts\n\t * const textInput = new TextInputBuilder({\n\t * \tcustom_id: 'a cool text input',\n\t * \tplaceholder: 'Type something',\n\t * \tstyle: TextInputStyle.Short,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a text input using setters and API data:\n\t * ```ts\n\t * const textInput = new TextInputBuilder({\n\t * \tplaceholder: 'Type something else',\n\t * })\n\t * \t.setCustomId('woah')\n\t * \t.setStyle(TextInputStyle.Paragraph);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APITextInputComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.TextInput };\n\t}\n\n\t/**\n\t * Sets the custom id for this text input.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customId;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the style for this text input.\n\t *\n\t * @param style - The style to use\n\t */\n\tpublic setStyle(style: TextInputStyle) {\n\t\tthis.data.style = style;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum length of text for this text input.\n\t *\n\t * @param minLength - The minimum length of text for this text input\n\t */\n\tpublic setMinLength(minLength: number) {\n\t\tthis.data.min_length = minLength;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the minimum length of text for this text input.\n\t */\n\tpublic clearMinLength() {\n\t\tthis.data.min_length = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum length of text for this text input.\n\t *\n\t * @param maxLength - The maximum length of text for this text input\n\t */\n\tpublic setMaxLength(maxLength: number) {\n\t\tthis.data.max_length = maxLength;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the maximum length of text for this text input.\n\t */\n\tpublic clearMaxLength() {\n\t\tthis.data.max_length = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the placeholder for this text input.\n\t *\n\t * @param placeholder - The placeholder to use\n\t */\n\tpublic setPlaceholder(placeholder: string) {\n\t\tthis.data.placeholder = placeholder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the placeholder for this text input.\n\t */\n\tpublic clearPlaceholder() {\n\t\tthis.data.placeholder = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value for this text input.\n\t *\n\t * @param value - The value to use\n\t */\n\tpublic setValue(value: string) {\n\t\tthis.data.value = value;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the value for this text input.\n\t */\n\tpublic clearValue() {\n\t\tthis.data.value = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this text input is required.\n\t *\n\t * @param required - Whether this text input is required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = required;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(validationOverride?: boolean): APITextInputComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(textInputPredicate, clone, validationOverride);\n\n\t\treturn clone as APITextInputComponent;\n\t}\n}\n","import { ComponentType, TextInputStyle } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { customIdPredicate, idPredicate } from '../../Assertions.js';\n\nexport const textInputPredicate = z.object({\n\tid: idPredicate,\n\ttype: z.literal(ComponentType.TextInput),\n\tcustom_id: customIdPredicate,\n\tstyle: z.enum(TextInputStyle),\n\tmin_length: z.number().min(0).max(4_000).optional(),\n\tmax_length: z.number().min(1).max(4_000).optional(),\n\tplaceholder: z.string().max(100).optional(),\n\tvalue: z.string().min(0).max(4_000).optional(),\n\trequired: z.boolean().optional(),\n});\n","import {\n\ttype APIComponentInMessageActionRow,\n\ttype APISeparatorComponent,\n\ttype APIActionRowComponent,\n\ttype APIFileComponent,\n\ttype APITextDisplayComponent,\n\ttype APIContainerComponent,\n\ttype APIComponentInContainer,\n\ttype APIMediaGalleryComponent,\n\ttype APISectionComponent,\n\tComponentType,\n} from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray';\nimport { resolveBuilder } from '../../util/resolveBuilder';\nimport { validate } from '../../util/validation';\nimport { ActionRowBuilder } from '../ActionRow.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { createComponentBuilder } from '../Components';\nimport { containerPredicate } from './Assertions';\nimport { FileBuilder } from './File.js';\nimport { MediaGalleryBuilder } from './MediaGallery';\nimport { SectionBuilder } from './Section';\nimport { SeparatorBuilder } from './Separator.js';\nimport { TextDisplayBuilder } from './TextDisplay';\n\nexport type ContainerComponentBuilders =\n\t| ActionRowBuilder\n\t| FileBuilder\n\t| MediaGalleryBuilder\n\t| SectionBuilder\n\t| SeparatorBuilder\n\t| TextDisplayBuilder;\n\nexport interface ContainerBuilderData extends Partial<Omit<APIContainerComponent, 'components'>> {\n\tcomponents: ContainerComponentBuilders[];\n}\n\n/**\n * A builder that creates API-compatible JSON data for containers.\n */\nexport class ContainerBuilder extends ComponentBuilder<APIContainerComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: ContainerBuilderData;\n\n\t/**\n\t * Gets the components within this container.\n\t */\n\tpublic get components(): readonly ContainerComponentBuilders[] {\n\t\treturn this.data.components;\n\t}\n\n\t/**\n\t * Creates a new container builder.\n\t *\n\t * @param data - The API data to create the container with\n\t */\n\tpublic constructor(data: Partial<APIContainerComponent> = {}) {\n\t\tsuper();\n\n\t\tconst { components = [], ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tcomponents: components.map((component) => createComponentBuilder(component)),\n\t\t\ttype: ComponentType.Container,\n\t\t};\n\t}\n\n\t/**\n\t * Sets the accent color of this container.\n\t *\n\t * @param color - The color to use\n\t */\n\tpublic setAccentColor(color: number) {\n\t\tthis.data.accent_color = color;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the accent color of this container.\n\t */\n\tpublic clearAccentColor() {\n\t\tthis.data.accent_color = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this container.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoiler;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds action row components to this container.\n\t *\n\t * @param input - The action row to add\n\t */\n\tpublic addActionRowComponents(\n\t\t...input: RestOrArray<\n\t\t\t| ActionRowBuilder\n\t\t\t| APIActionRowComponent<APIComponentInMessageActionRow>\n\t\t\t| ((builder: ActionRowBuilder) => ActionRowBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, ActionRowBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds file components to this container.\n\t *\n\t * @param input - The file components to add\n\t */\n\tpublic addFileComponents(\n\t\t...input: RestOrArray<APIFileComponent | FileBuilder | ((builder: FileBuilder) => FileBuilder)>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, FileBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds media gallery components to this container.\n\t *\n\t * @param input - The media gallery components to add\n\t */\n\tpublic addMediaGalleryComponents(\n\t\t...input: RestOrArray<\n\t\t\tAPIMediaGalleryComponent | MediaGalleryBuilder | ((builder: MediaGalleryBuilder) => MediaGalleryBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, MediaGalleryBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds section components to this container.\n\t *\n\t * @param input - The section components to add\n\t */\n\tpublic addSectionComponents(\n\t\t...input: RestOrArray<APISectionComponent | SectionBuilder | ((builder: SectionBuilder) => SectionBuilder)>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, SectionBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds separator components to this container.\n\t *\n\t * @param input - The separator components to add\n\t */\n\tpublic addSeparatorComponents(\n\t\t...input: RestOrArray<APISeparatorComponent | SeparatorBuilder | ((builder: SeparatorBuilder) => SeparatorBuilder)>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, SeparatorBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds text display components to this container.\n\t *\n\t * @param input - The text display components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...input: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, TextDisplayBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts components for this container\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing components of a container.\n\t * @example\n\t * Remove the first component:\n\t * ```ts\n\t * container.spliceComponents(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n components:\n\t * ```ts\n\t * const n = 4;\n\t * container.spliceComponents(0, n);\n\t * ```\n\t * @example\n\t * Remove the last component:\n\t * ```ts\n\t * container.spliceComponents(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of components to remove\n\t * @param components - The replacing component objects\n\t */\n\tpublic spliceComponents(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...components: RestOrArray<APIComponentInContainer | ContainerComponentBuilders>\n\t): this {\n\t\tconst normalized = normalizeArray(components);\n\t\tconst resolved = normalized.map((component) =>\n\t\t\tcomponent instanceof ComponentBuilder ? component : createComponentBuilder(component),\n\t\t);\n\n\t\tthis.data.components.splice(index, deleteCount, ...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIContainerComponent {\n\t\tconst { components, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\tcomponents: components.map((component) => component.toJSON(false)),\n\t\t};\n\n\t\tvalidate(containerPredicate, data, validationOverride);\n\n\t\treturn data as APIContainerComponent;\n\t}\n}\n","import { ComponentType, SeparatorSpacingSize } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { idPredicate } from '../../Assertions.js';\nimport { actionRowPredicate } from '../Assertions.js';\n\nconst unfurledMediaItemPredicate = z.object({\n\turl: z.url({ protocol: /^(?:https?|attachment)$/ }),\n});\n\nexport const thumbnailPredicate = z.object({\n\ttype: z.literal(ComponentType.Thumbnail),\n\tid: idPredicate,\n\tmedia: unfurledMediaItemPredicate,\n\tdescription: z.string().min(1).max(1_024).nullish(),\n\tspoiler: z.boolean().optional(),\n});\n\nconst unfurledMediaItemAttachmentOnlyPredicate = z.object({\n\turl: z.url({ protocol: /^attachment$/ }),\n});\n\nexport const filePredicate = z.object({\n\ttype: z.literal(ComponentType.File),\n\tid: idPredicate,\n\tfile: unfurledMediaItemAttachmentOnlyPredicate,\n\tspoiler: z.boolean().optional(),\n});\n\nexport const separatorPredicate = z.object({\n\ttype: z.literal(ComponentType.Separator),\n\tid: idPredicate,\n\tdivider: z.boolean().optional(),\n\tspacing: z.enum(SeparatorSpacingSize).optional(),\n});\n\nexport const textDisplayPredicate = z.object({\n\ttype: z.literal(ComponentType.TextDisplay),\n\tid: idPredicate,\n\tcontent: z.string().min(1).max(4_000),\n});\n\nexport const mediaGalleryItemPredicate = z.object({\n\tid: idPredicate,\n\tmedia: unfurledMediaItemPredicate,\n\tdescription: z.string().min(1).max(1_024).nullish(),\n\tspoiler: z.boolean().optional(),\n});\n\nexport const mediaGalleryPredicate = z.object({\n\ttype: z.literal(ComponentType.MediaGallery),\n\tid: idPredicate,\n\titems: z.array(mediaGalleryItemPredicate).min(1).max(10),\n});\n\nexport const sectionPredicate = z.object({\n\ttype: z.literal(ComponentType.Section),\n\tid: idPredicate,\n\tcomponents: z.array(textDisplayPredicate).min(1).max(3),\n\taccessory: z.union([\n\t\tz.object({ type: z.literal(ComponentType.Button) }),\n\t\tz.object({ type: z.literal(ComponentType.Thumbnail) }),\n\t]),\n});\n\nexport const containerPredicate = z.object({\n\ttype: z.literal(ComponentType.Container),\n\tid: idPredicate,\n\tcomponents: z\n\t\t.array(\n\t\t\tz.union([\n\t\t\t\tactionRowPredicate,\n\t\t\t\tfilePredicate,\n\t\t\t\tmediaGalleryPredicate,\n\t\t\t\tsectionPredicate,\n\t\t\t\tseparatorPredicate,\n\t\t\t\ttextDisplayPredicate,\n\t\t\t]),\n\t\t)\n\t\t.min(1),\n\tspoiler: z.boolean().optional(),\n\taccent_color: z.int().min(0).max(0xffffff).nullish(),\n});\n","import { ComponentType, type APIFileComponent } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { filePredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for files.\n */\nexport class FileBuilder extends ComponentBuilder<APIFileComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: Partial<APIFileComponent>;\n\n\t/**\n\t * Creates a new file.\n\t *\n\t * @param data - The API data to create this file with\n\t * @example\n\t * Creating a file from an API data object:\n\t * ```ts\n\t * const file = new FileBuilder({\n\t * \tspoiler: true,\n\t * \tfile: {\n\t * \t\turl: 'attachment://file.png',\n\t * \t},\n\t * });\n\t * ```\n\t * @example\n\t * Creating a file using setters and API data:\n\t * ```ts\n\t * const file = new FileBuilder({\n\t * \tfile: {\n\t * \t\turl: 'attachment://image.jpg',\n\t * \t},\n\t * })\n\t * \t.setSpoiler(false);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIFileComponent> = {}) {\n\t\tsuper();\n\n\t\tconst { file, ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tfile: file && { url: file.url },\n\t\t\ttype: ComponentType.File,\n\t\t};\n\t}\n\n\t/**\n\t * Sets the spoiler status of this file.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoiler;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the media URL of this file.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.file = { url };\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIFileComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(filePredicate, clone, validationOverride);\n\n\t\treturn clone as APIFileComponent;\n\t}\n}\n","import { type APIMediaGalleryItem, type APIMediaGalleryComponent, ComponentType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../util/resolveBuilder.js';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { mediaGalleryPredicate } from './Assertions.js';\nimport { MediaGalleryItemBuilder } from './MediaGalleryItem.js';\n\nexport interface MediaGalleryBuilderData extends Partial<Omit<APIMediaGalleryComponent, 'items'>> {\n\titems: MediaGalleryItemBuilder[];\n}\n\n/**\n * A builder that creates API-compatible JSON data for media galleries.\n */\nexport class MediaGalleryBuilder extends ComponentBuilder<APIMediaGalleryComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: MediaGalleryBuilderData;\n\n\t/**\n\t * The items in this media gallery.\n\t */\n\tpublic get items(): readonly MediaGalleryItemBuilder[] {\n\t\treturn this.data.items;\n\t}\n\n\t/**\n\t * Creates a new media gallery.\n\t *\n\t * @param data - The API data to create this container with\n\t * @example\n\t * Creating a media gallery from an API data object:\n\t * ```ts\n\t * const mediaGallery = new MediaGalleryBuilder({\n\t * \titems: [\n\t * \t\t{\n\t * \t\t\tdescription: \"Some text here\",\n\t * \t\t\tmedia: {\n\t * \t\t\t\turl: 'https://cdn.discordapp.com/embed/avatars/2.png',\n\t * \t\t\t},\n\t * \t\t},\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating a media gallery using setters and API data:\n\t * ```ts\n\t * const mediaGallery = new MediaGalleryBuilder({\n\t * \titems: [\n\t * \t\t{\n\t * \t\t\tdescription: \"alt text\",\n\t * \t\t\tmedia: {\n\t * \t\t\t\turl: 'https://cdn.discordapp.com/embed/avatars/5.png',\n\t * \t\t\t},\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.addItems(item2, item3);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIMediaGalleryComponent> = {}) {\n\t\tsuper();\n\n\t\tconst { items = [], ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\titems: items.map((item) => new MediaGalleryItemBuilder(item)),\n\t\t\ttype: ComponentType.MediaGallery,\n\t\t};\n\t}\n\n\t/**\n\t * Adds a media gallery item to this media gallery.\n\t *\n\t * @param input - The items to add\n\t */\n\tpublic addItems(\n\t\t...input: RestOrArray<\n\t\t\tAPIMediaGalleryItem | MediaGalleryItemBuilder | ((builder: MediaGalleryItemBuilder) => MediaGalleryItemBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((item) => resolveBuilder(item, MediaGalleryItemBuilder));\n\n\t\tthis.data.items.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts media gallery items for this media gallery.\n\t *\n\t * @param index - The index to start removing, replacing or inserting items\n\t * @param deleteCount - The amount of items to remove\n\t * @param items - The items to insert\n\t */\n\tpublic spliceItems(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...items: RestOrArray<\n\t\t\tAPIMediaGalleryItem | MediaGalleryItemBuilder | ((builder: MediaGalleryItemBuilder) => MediaGalleryItemBuilder)\n\t\t>\n\t) {\n\t\tconst normalized = normalizeArray(items);\n\t\tconst resolved = normalized.map((item) => resolveBuilder(item, MediaGalleryItemBuilder));\n\n\t\tthis.data.items.splice(index, deleteCount, ...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIMediaGalleryComponent {\n\t\tconst { items, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\titems: items.map((item) => item.toJSON(false)),\n\t\t};\n\n\t\tvalidate(mediaGalleryPredicate, data, validationOverride);\n\n\t\treturn data as APIMediaGalleryComponent;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIMediaGalleryItem } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { mediaGalleryItemPredicate } from './Assertions.js';\n\nexport class MediaGalleryItemBuilder implements JSONEncodable<APIMediaGalleryItem> {\n\tprivate readonly data: Partial<APIMediaGalleryItem>;\n\n\t/**\n\t * Creates a new media gallery item.\n\t *\n\t * @param data - The API data to create this media gallery item with\n\t * @example\n\t * Creating a media gallery item from an API data object:\n\t * ```ts\n\t * const item = new MediaGalleryItemBuilder({\n\t * \tdescription: \"Some text here\",\n\t * \tmedia: {\n\t * \t\turl: 'https://cdn.discordapp.com/embed/avatars/2.png',\n\t * \t},\n\t * });\n\t * ```\n\t * @example\n\t * Creating a media gallery item using setters and API data:\n\t * ```ts\n\t * const item = new MediaGalleryItemBuilder({\n\t * \tmedia: {\n\t * \t\turl: 'https://cdn.discordapp.com/embed/avatars/5.png',\n\t * \t},\n\t * })\n\t * \t.setDescription(\"alt text\");\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIMediaGalleryItem> = {}) {\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * Sets the source URL of this media gallery item.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.media = { url };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this thumbnail.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = description;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description of this thumbnail.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this thumbnail.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoiler;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Transforms this object to its JSON format\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIMediaGalleryItem {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(mediaGalleryItemPredicate, clone, validationOverride);\n\n\t\treturn clone as APIMediaGalleryItem;\n\t}\n}\n","import type {\n\tAPITextDisplayComponent,\n\tAPISectionComponent,\n\tAPIButtonComponentWithCustomId,\n\tAPIThumbnailComponent,\n\tAPIButtonComponentWithSKUId,\n\tAPIButtonComponentWithURL,\n\tButtonStyle,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../util/resolveBuilder.js';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { resolveAccessoryComponent, type ButtonBuilder } from '../Components.js';\nimport {\n\tDangerButtonBuilder,\n\tPrimaryButtonBuilder,\n\tSecondaryButtonBuilder,\n\tSuccessButtonBuilder,\n} from '../button/CustomIdButton.js';\nimport { LinkButtonBuilder } from '../button/LinkButton.js';\nimport { PremiumButtonBuilder } from '../button/PremiumButton.js';\nimport { sectionPredicate } from './Assertions.js';\nimport { TextDisplayBuilder } from './TextDisplay.js';\nimport { ThumbnailBuilder } from './Thumbnail.js';\n\nexport type SectionBuilderAccessory = ButtonBuilder | ThumbnailBuilder;\n\nexport interface SectionBuilderData extends Partial<Omit<APISectionComponent, 'accessory' | 'components'>> {\n\taccessory?: SectionBuilderAccessory;\n\tcomponents: TextDisplayBuilder[];\n}\n\n/**\n * A builder that creates API-compatible JSON data for sections.\n */\nexport class SectionBuilder extends ComponentBuilder<APISectionComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: SectionBuilderData;\n\n\t/**\n\t * The components within this section.\n\t */\n\tpublic get components(): readonly TextDisplayBuilder[] {\n\t\treturn this.data.components;\n\t}\n\n\t/**\n\t * Creates a new section.\n\t *\n\t * @param data - The API data to create this section with\n\t * @example\n\t * Creating a section from an API data object:\n\t * ```ts\n\t * const section = new SectionBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"Some text here\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * accessory: {\n\t * media: {\n\t * url: 'https://cdn.discordapp.com/embed/avatars/3.png',\n\t * },\n\t * }\n\t * });\n\t * ```\n\t * @example\n\t * Creating a section using setters and API data:\n\t * ```ts\n\t * const section = new SectionBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"# Heading\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.setPrimaryButtonAccessory(button);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APISectionComponent> = {}) {\n\t\tsuper();\n\n\t\tconst { components = [], accessory, ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\taccessory: accessory && resolveAccessoryComponent(accessory),\n\t\t\tcomponents: components.map((component) => new TextDisplayBuilder(component)),\n\t\t\ttype: ComponentType.Section,\n\t\t};\n\t}\n\n\t/**\n\t * Adds text display components to this section.\n\t *\n\t * @param input - The text display components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...input: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, TextDisplayBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a primary button component to be the accessory of this section.\n\t *\n\t * @param input - The button to set as the accessory\n\t */\n\tpublic setPrimaryButtonAccessory(\n\t\tinput:\n\t\t\t| PrimaryButtonBuilder\n\t\t\t| ((builder: PrimaryButtonBuilder) => PrimaryButtonBuilder)\n\t\t\t| (APIButtonComponentWithCustomId & { style: ButtonStyle.Primary }),\n\t): this {\n\t\tconst builder = resolveBuilder(input, PrimaryButtonBuilder);\n\n\t\tthis.data.accessory = builder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a secondary button component to be the accessory of this section.\n\t *\n\t * @param input - The button to set as the accessory\n\t */\n\tpublic setSecondaryButtonAccessory(\n\t\tinput:\n\t\t\t| SecondaryButtonBuilder\n\t\t\t| ((builder: SecondaryButtonBuilder) => SecondaryButtonBuilder)\n\t\t\t| (APIButtonComponentWithCustomId & { style: ButtonStyle.Secondary }),\n\t): this {\n\t\tconst builder = resolveBuilder(input, SecondaryButtonBuilder);\n\n\t\tthis.data.accessory = builder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a success button component to be the accessory of this section.\n\t *\n\t * @param input - The button to set as the accessory\n\t */\n\tpublic setSuccessButtonAccessory(\n\t\tinput:\n\t\t\t| SuccessButtonBuilder\n\t\t\t| ((builder: SuccessButtonBuilder) => SuccessButtonBuilder)\n\t\t\t| (APIButtonComponentWithCustomId & { style: ButtonStyle.Success }),\n\t): this {\n\t\tconst builder = resolveBuilder(input, SuccessButtonBuilder);\n\n\t\tthis.data.accessory = builder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a danger button component to be the accessory of this section.\n\t *\n\t * @param input - The button to set as the accessory\n\t */\n\tpublic setDangerButtonAccessory(\n\t\tinput:\n\t\t\t| DangerButtonBuilder\n\t\t\t| ((builder: DangerButtonBuilder) => DangerButtonBuilder)\n\t\t\t| (APIButtonComponentWithCustomId & { style: ButtonStyle.Danger }),\n\t): this {\n\t\tconst builder = resolveBuilder(input, DangerButtonBuilder);\n\n\t\tthis.data.accessory = builder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a SKU id button component to be the accessory of this section.\n\t *\n\t * @param input - The button to set as the accessory\n\t */\n\tpublic setPremiumButtonAccessory(\n\t\tinput:\n\t\t\t| APIButtonComponentWithSKUId\n\t\t\t| PremiumButtonBuilder\n\t\t\t| ((builder: PremiumButtonBuilder) => PremiumButtonBuilder),\n\t): this {\n\t\tconst builder = resolveBuilder(input, PremiumButtonBuilder);\n\n\t\tthis.data.accessory = builder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a URL button component to be the accessory of this section.\n\t *\n\t * @param input - The button to set as the accessory\n\t */\n\tpublic setLinkButtonAccessory(\n\t\tinput: APIButtonComponentWithURL | LinkButtonBuilder | ((builder: LinkButtonBuilder) => LinkButtonBuilder),\n\t): this {\n\t\tconst builder = resolveBuilder(input, LinkButtonBuilder);\n\n\t\tthis.data.accessory = builder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a thumbnail component to be the accessory of this section.\n\t *\n\t * @param input - The thumbnail to set as the accessory\n\t */\n\tpublic setThumbnailAccessory(\n\t\tinput: APIThumbnailComponent | ThumbnailBuilder | ((builder: ThumbnailBuilder) => ThumbnailBuilder),\n\t): this {\n\t\tconst builder = resolveBuilder(input, ThumbnailBuilder);\n\n\t\tthis.data.accessory = builder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts text display components for this section.\n\t *\n\t * @param index - The index to start removing, replacing or inserting text display components\n\t * @param deleteCount - The amount of text display components to remove\n\t * @param components - The text display components to insert\n\t */\n\tpublic spliceTextDisplayComponents(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...components: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(components);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, TextDisplayBuilder));\n\n\t\tthis.data.components.splice(index, deleteCount, ...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APISectionComponent {\n\t\tconst { components, accessory, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\tcomponents: components.map((component) => component.toJSON(false)),\n\t\t\taccessory: accessory?.toJSON(validationOverride),\n\t\t};\n\n\t\tvalidate(sectionPredicate, data, validationOverride);\n\n\t\treturn data as APISectionComponent;\n\t}\n}\n","import type { APITextDisplayComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { textDisplayPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for text displays.\n */\nexport class TextDisplayBuilder extends ComponentBuilder<APITextDisplayComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: Partial<APITextDisplayComponent>;\n\n\t/**\n\t * Creates a new text display.\n\t *\n\t * @param data - The API data to create this text display with\n\t * @example\n\t * Creating a text display from an API data object:\n\t * ```ts\n\t * const textDisplay = new TextDisplayBuilder({\n\t * \tcontent: 'some text',\n\t * });\n\t * ```\n\t * @example\n\t * Creating a text display using setters and API data:\n\t * ```ts\n\t * const textDisplay = new TextDisplayBuilder({\n\t * \tcontent: 'old text',\n\t * })\n\t * \t.setContent('new text');\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APITextDisplayComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = {\n\t\t\t...structuredClone(data),\n\t\t\ttype: ComponentType.TextDisplay,\n\t\t};\n\t}\n\n\t/**\n\t * Sets the text of this text display.\n\t *\n\t * @param content - The text to use\n\t */\n\tpublic setContent(content: string) {\n\t\tthis.data.content = content;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APITextDisplayComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(textDisplayPredicate, clone, validationOverride);\n\n\t\treturn clone as APITextDisplayComponent;\n\t}\n}\n","import type { APIThumbnailComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { thumbnailPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for thumbnails.\n */\nexport class ThumbnailBuilder extends ComponentBuilder<APIThumbnailComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: Partial<APIThumbnailComponent>;\n\n\t/**\n\t * Creates a new thumbnail.\n\t *\n\t * @param data - The API data to create this thumbnail with\n\t * @example\n\t * Creating a thumbnail from an API data object:\n\t * ```ts\n\t * const thumbnail = new ThumbnailBuilder({\n\t * \tdescription: 'some text',\n\t * media: {\n\t * url: 'https://cdn.discordapp.com/embed/avatars/4.png',\n\t * },\n\t * });\n\t * ```\n\t * @example\n\t * Creating a thumbnail using setters and API data:\n\t * ```ts\n\t * const thumbnail = new ThumbnailBuilder({\n\t * \tmedia: {\n\t * url: 'attachment://image.png',\n\t * },\n\t * })\n\t * \t.setDescription('alt text');\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIThumbnailComponent> = {}) {\n\t\tsuper();\n\n\t\tconst { media, ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tmedia: media && { url: media.url },\n\t\t\ttype: ComponentType.Thumbnail,\n\t\t};\n\t}\n\n\t/**\n\t * Sets the description of this thumbnail.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = description;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description of this thumbnail.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this thumbnail.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoiler;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the media URL of this thumbnail.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.media = { url };\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritdoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIThumbnailComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(thumbnailPredicate, clone, validationOverride);\n\n\t\treturn clone as APIThumbnailComponent;\n\t}\n}\n","import type { SeparatorSpacingSize, APISeparatorComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { separatorPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for separators.\n */\nexport class SeparatorBuilder extends ComponentBuilder<APISeparatorComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: Partial<APISeparatorComponent>;\n\n\t/**\n\t * Creates a new separator.\n\t *\n\t * @param data - The API data to create this separator with\n\t * @example\n\t * Creating a separator from an API data object:\n\t * ```ts\n\t * const separator = new SeparatorBuilder({\n\t * \tspacing: SeparatorSpacingSize.Small,\n\t * divider: true,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a separator using setters and API data:\n\t * ```ts\n\t * const separator = new SeparatorBuilder({\n\t * \tspacing: SeparatorSpacingSize.Large,\n\t * })\n\t * \t.setDivider(false);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APISeparatorComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = {\n\t\t\t...structuredClone(data),\n\t\t\ttype: ComponentType.Separator,\n\t\t};\n\t}\n\n\t/**\n\t * Sets whether this separator should show a divider line.\n\t *\n\t * @param divider - Whether to show a divider line\n\t */\n\tpublic setDivider(divider = true) {\n\t\tthis.data.divider = divider;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spacing of this separator.\n\t *\n\t * @param spacing - The spacing to use\n\t */\n\tpublic setSpacing(spacing: SeparatorSpacingSize) {\n\t\tthis.data.spacing = spacing;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the spacing of this separator.\n\t */\n\tpublic clearSpacing() {\n\t\tthis.data.spacing = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APISeparatorComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(separatorPredicate, clone, validationOverride);\n\n\t\treturn clone as APISeparatorComponent;\n\t}\n}\n","import { ComponentType } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { idPredicate } from '../../Assertions';\nimport {\n\tselectMenuChannelPredicate,\n\tselectMenuMentionablePredicate,\n\tselectMenuRolePredicate,\n\tselectMenuStringPredicate,\n\tselectMenuUserPredicate,\n} from '../Assertions';\nimport { fileUploadPredicate } from '../fileUpload/Assertions';\nimport { textInputPredicate } from '../textInput/Assertions';\n\nexport const labelPredicate = z.object({\n\tid: idPredicate,\n\ttype: z.literal(ComponentType.Label),\n\tlabel: z.string().min(1).max(45),\n\tdescription: z.string().min(1).max(100).optional(),\n\tcomponent: z.union([\n\t\tselectMenuStringPredicate,\n\t\ttextInputPredicate,\n\t\tselectMenuUserPredicate,\n\t\tselectMenuRolePredicate,\n\t\tselectMenuMentionablePredicate,\n\t\tselectMenuChannelPredicate,\n\t\tfileUploadPredicate,\n\t]),\n});\n","import type { APIApplicationCommandIntegerOption } from 'discord-api-types/v10';\n\nexport interface ApplicationCommandNumericOptionMinMaxValueData extends Pick<\n\tAPIApplicationCommandIntegerOption,\n\t'max_value' | 'min_value'\n> {}\n\n/**\n * This mixin holds minimum and maximum symbols used for options.\n */\nexport abstract class ApplicationCommandNumericOptionMinMaxValueMixin {\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: ApplicationCommandNumericOptionMinMaxValueData;\n\n\t/**\n\t * Sets the maximum number value of this option.\n\t *\n\t * @param max - The maximum value this option can be\n\t */\n\tpublic setMaxValue(max: number): this {\n\t\tthis.data.max_value = max;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes the maximum number value of this option.\n\t */\n\tpublic clearMaxValue(): this {\n\t\tthis.data.max_value = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum number value of this option.\n\t *\n\t * @param min - The minimum value this option can be\n\t */\n\tpublic setMinValue(min: number): this {\n\t\tthis.data.min_value = min;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes the minimum number value of this option.\n\t */\n\tpublic clearMinValue(): this {\n\t\tthis.data.min_value = undefined;\n\t\treturn this;\n\t}\n}\n","import { ChannelType, type APIApplicationCommandChannelOption } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../../../util/normalizeArray';\n\nexport const ApplicationCommandOptionAllowedChannelTypes = [\n\tChannelType.GuildText,\n\tChannelType.GuildVoice,\n\tChannelType.GuildCategory,\n\tChannelType.GuildAnnouncement,\n\tChannelType.AnnouncementThread,\n\tChannelType.PublicThread,\n\tChannelType.PrivateThread,\n\tChannelType.GuildStageVoice,\n\tChannelType.GuildForum,\n\tChannelType.GuildMedia,\n] as const;\n\n/**\n * Allowed channel types used for a channel option.\n */\nexport type ApplicationCommandOptionAllowedChannelType = (typeof ApplicationCommandOptionAllowedChannelTypes)[number];\n\nexport interface ApplicationCommandOptionChannelTypesData extends Pick<\n\tAPIApplicationCommandChannelOption,\n\t'channel_types'\n> {}\n\n/**\n * This mixin holds channel type symbols used for options.\n */\nexport class ApplicationCommandOptionChannelTypesMixin {\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: ApplicationCommandOptionChannelTypesData;\n\n\t/**\n\t * Adds channel types to this option.\n\t *\n\t * @param channelTypes - The channel types\n\t */\n\tpublic addChannelTypes(...channelTypes: RestOrArray<ApplicationCommandOptionAllowedChannelType>) {\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.push(...normalizeArray(channelTypes));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the channel types for this option.\n\t *\n\t * @param channelTypes - The channel types\n\t */\n\tpublic setChannelTypes(...channelTypes: RestOrArray<ApplicationCommandOptionAllowedChannelType>) {\n\t\tthis.data.channel_types = normalizeArray(channelTypes);\n\t\treturn this;\n\t}\n}\n","import type {\n\tAPIApplicationCommandIntegerOption,\n\tAPIApplicationCommandNumberOption,\n\tAPIApplicationCommandStringOption,\n} from 'discord-api-types/v10';\n\nexport type AutocompletableOptions =\n\t| APIApplicationCommandIntegerOption\n\t| APIApplicationCommandNumberOption\n\t| APIApplicationCommandStringOption;\n\nexport interface ApplicationCommandOptionWithAutocompleteData extends Pick<AutocompletableOptions, 'autocomplete'> {}\n\n/**\n * This mixin holds choices and autocomplete symbols used for options.\n */\nexport class ApplicationCommandOptionWithAutocompleteMixin {\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: ApplicationCommandOptionWithAutocompleteData;\n\n\t/**\n\t * Whether this option uses autocomplete.\n\t *\n\t * @param autocomplete - Whether this option should use autocomplete\n\t */\n\tpublic setAutocomplete(autocomplete = true): this {\n\t\tthis.data.autocomplete = autocomplete;\n\t\treturn this;\n\t}\n}\n","import type { APIApplicationCommandOptionChoice } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../../../util/normalizeArray.js';\n\n// Unlike other places, we're not `Pick`ing from discord-api-types. The union includes `[]` and it breaks everything.\nexport interface ApplicationCommandOptionWithChoicesData {\n\tchoices?: APIApplicationCommandOptionChoice<number | string>[];\n}\n\n/**\n * This mixin holds choices and autocomplete symbols used for options.\n *\n * @typeParam ChoiceType - The type of the choices within this option\n */\nexport class ApplicationCommandOptionWithChoicesMixin<ChoiceType extends number | string> {\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: ApplicationCommandOptionWithChoicesData;\n\n\t/**\n\t * Adds multiple choices to this option.\n\t *\n\t * @param choices - The choices to add\n\t */\n\tpublic addChoices(...choices: RestOrArray<APIApplicationCommandOptionChoice<ChoiceType>>): this {\n\t\tconst normalizedChoices = normalizeArray(choices);\n\n\t\tthis.data.choices ??= [];\n\t\tthis.data.choices.push(...normalizedChoices);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets multiple choices for this option.\n\t *\n\t * @param choices - The choices to set\n\t */\n\tpublic setChoices(...choices: RestOrArray<APIApplicationCommandOptionChoice<ChoiceType>>): this {\n\t\tthis.data.choices = normalizeArray(choices);\n\t\treturn this;\n\t}\n}\n","import { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command attachment option.\n */\nexport class ChatInputCommandAttachmentOption extends ApplicationCommandOptionBase {\n\t/**\n\t * Creates a new attachment option.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Attachment);\n\t}\n}\n","import type { Locale, RESTPostAPIApplicationCommandsJSONBody } from 'discord-api-types/v10';\n\nexport interface SharedNameData extends Partial<\n\tPick<RESTPostAPIApplicationCommandsJSONBody, 'name_localizations' | 'name'>\n> {}\n\n/**\n * This mixin holds name and description symbols for chat input commands.\n */\nexport class SharedName {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: SharedNameData = {};\n\n\t/**\n\t * Sets the name of this command.\n\t *\n\t * @param name - The name to use\n\t */\n\tpublic setName(name: string): this {\n\t\tthis.data.name = name;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a name localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedName - The localized name for the given `locale`\n\t */\n\tpublic setNameLocalization(locale: Locale, localizedName: string) {\n\t\tthis.data.name_localizations ??= {};\n\t\tthis.data.name_localizations[locale] = localizedName;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears a name localization for this command.\n\t *\n\t * @param locale - The locale to clear\n\t */\n\tpublic clearNameLocalization(locale: Locale) {\n\t\tthis.data.name_localizations ??= {};\n\t\tthis.data.name_localizations[locale] = undefined;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name localizations for this command.\n\t *\n\t * @param localizedNames - The object of localized names to set\n\t */\n\tpublic setNameLocalizations(localizedNames: Partial<Record<Locale, string>>) {\n\t\tthis.data.name_localizations = structuredClone(localizedNames);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears all name localizations for this command.\n\t */\n\tpublic clearNameLocalizations() {\n\t\tthis.data.name_localizations = undefined;\n\t\treturn this;\n\t}\n}\n","import type { APIApplicationCommand, Locale } from 'discord-api-types/v10';\nimport type { SharedNameData } from './SharedName.js';\nimport { SharedName } from './SharedName.js';\n\nexport interface SharedNameAndDescriptionData\n\textends SharedNameData, Partial<Pick<APIApplicationCommand, 'description_localizations' | 'description'>> {}\n\n/**\n * This mixin holds name and description symbols for chat input commands.\n */\nexport class SharedNameAndDescription extends SharedName {\n\t/**\n\t * @internal\n\t */\n\tprotected override readonly data: SharedNameAndDescriptionData = {};\n\n\t/**\n\t * Sets the description of this command.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = description;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a description localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedDescription - The localized description for the given `locale`\n\t */\n\tpublic setDescriptionLocalization(locale: Locale, localizedDescription: string) {\n\t\tthis.data.description_localizations ??= {};\n\t\tthis.data.description_localizations[locale] = localizedDescription;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears a description localization for this command.\n\t *\n\t * @param locale - The locale to clear\n\t */\n\tpublic clearDescriptionLocalization(locale: Locale) {\n\t\tthis.data.description_localizations ??= {};\n\t\tthis.data.description_localizations[locale] = undefined;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description localizations for this command.\n\t *\n\t * @param localizedDescriptions - The object of localized descriptions to set\n\t */\n\tpublic setDescriptionLocalizations(localizedDescriptions: Partial<Record<Locale, string>>) {\n\t\tthis.data.description_localizations = structuredClone(localizedDescriptions);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears all description localizations for this command.\n\t */\n\tpublic clearDescriptionLocalizations() {\n\t\tthis.data.description_localizations = undefined;\n\t\treturn this;\n\t}\n}\n","import {\n\tApplicationIntegrationType,\n\tInteractionContextType,\n\tApplicationCommandOptionType,\n} from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { localeMapPredicate, memberPermissionsPredicate } from '../../../Assertions.js';\nimport { ApplicationCommandOptionAllowedChannelTypes } from './mixins/ApplicationCommandOptionChannelTypesMixin.js';\n\nconst namePredicate = z\n\t.string()\n\t.min(1)\n\t.max(32)\n\t.regex(/^[\\p{Ll}\\p{Lm}\\p{Lo}\\p{N}\\p{sc=Devanagari}\\p{sc=Thai}_-]+$/u);\n\nconst descriptionPredicate = z.string().min(1).max(100);\n\nconst sharedNameAndDescriptionPredicate = z.object({\n\tname: namePredicate,\n\tname_localizations: localeMapPredicate.optional(),\n\tdescription: descriptionPredicate,\n\tdescription_localizations: localeMapPredicate.optional(),\n});\n\nconst numericMixinNumberOptionPredicate = z.object({\n\tmax_value: z.float32().optional(),\n\tmin_value: z.float32().optional(),\n});\n\nconst numericMixinIntegerOptionPredicate = z.object({\n\tmax_value: z.int().optional(),\n\tmin_value: z.int().optional(),\n});\n\nconst channelMixinOptionPredicate = z.object({\n\tchannel_types: z.literal(ApplicationCommandOptionAllowedChannelTypes).array().optional(),\n});\n\nconst autocompleteMixinOptionPredicate = z.object({\n\tautocomplete: z.literal(true),\n\tchoices: z.union([z.never(), z.never().array(), z.undefined()]),\n});\n\nconst choiceValueStringPredicate = z.string().min(1).max(100);\nconst choiceValueNumberPredicate = z.number();\nconst choiceBasePredicate = z.object({\n\tname: choiceValueStringPredicate,\n\tname_localizations: localeMapPredicate.optional(),\n});\nconst choiceStringPredicate = choiceBasePredicate.extend({\n\tvalue: choiceValueStringPredicate,\n});\nconst choiceNumberPredicate = choiceBasePredicate.extend({\n\tvalue: choiceValueNumberPredicate,\n});\n\nconst choiceBaseMixinPredicate = z.object({\n\tautocomplete: z.literal(false).optional(),\n});\nconst choiceStringMixinPredicate = choiceBaseMixinPredicate.extend({\n\tchoices: choiceStringPredicate.array().max(25).optional(),\n});\nconst choiceNumberMixinPredicate = choiceBaseMixinPredicate.extend({\n\tchoices: choiceNumberPredicate.array().max(25).optional(),\n});\n\nconst basicOptionTypesPredicate = z.literal([\n\tApplicationCommandOptionType.Attachment,\n\tApplicationCommandOptionType.Boolean,\n\tApplicationCommandOptionType.Channel,\n\tApplicationCommandOptionType.Integer,\n\tApplicationCommandOptionType.Mentionable,\n\tApplicationCommandOptionType.Number,\n\tApplicationCommandOptionType.Role,\n\tApplicationCommandOptionType.String,\n\tApplicationCommandOptionType.User,\n]);\n\nexport const basicOptionPredicate = sharedNameAndDescriptionPredicate.extend({\n\trequired: z.boolean().optional(),\n\ttype: basicOptionTypesPredicate,\n});\n\nconst autocompleteOrStringChoicesMixinOptionPredicate = z.discriminatedUnion('autocomplete', [\n\tautocompleteMixinOptionPredicate,\n\tchoiceStringMixinPredicate,\n]);\n\nconst autocompleteOrNumberChoicesMixinOptionPredicate = z.discriminatedUnion('autocomplete', [\n\tautocompleteMixinOptionPredicate,\n\tchoiceNumberMixinPredicate,\n]);\n\nexport const channelOptionPredicate = z.object({\n\t...basicOptionPredicate.shape,\n\t...channelMixinOptionPredicate.shape,\n});\n\nexport const integerOptionPredicate = z\n\t.object({\n\t\t...basicOptionPredicate.shape,\n\t\t...numericMixinIntegerOptionPredicate.shape,\n\t})\n\t.and(autocompleteOrNumberChoicesMixinOptionPredicate);\n\nexport const numberOptionPredicate = z\n\t.object({\n\t\t...basicOptionPredicate.shape,\n\t\t...numericMixinNumberOptionPredicate.shape,\n\t})\n\t.and(autocompleteOrNumberChoicesMixinOptionPredicate);\n\nexport const stringOptionPredicate = basicOptionPredicate\n\t.extend({\n\t\tmax_length: z.number().min(1).max(6_000).optional(),\n\t\tmin_length: z.number().min(0).max(6_000).optional(),\n\t})\n\t.and(autocompleteOrStringChoicesMixinOptionPredicate);\n\nconst baseChatInputCommandPredicate = sharedNameAndDescriptionPredicate.extend({\n\tcontexts: z.array(z.enum(InteractionContextType)).optional(),\n\tdefault_member_permissions: memberPermissionsPredicate.optional(),\n\tintegration_types: z.array(z.enum(ApplicationIntegrationType)).optional(),\n\tnsfw: z.boolean().optional(),\n});\n\n// Because you can only add options via builders, there's no need to validate whole objects here otherwise\nconst chatInputCommandOptionsPredicate = z.union([\n\tz.object({ type: basicOptionTypesPredicate }).array(),\n\tz\n\t\t.object({\n\t\t\ttype: z.union([\n\t\t\t\tz.literal(ApplicationCommandOptionType.Subcommand),\n\t\t\t\tz.literal(ApplicationCommandOptionType.SubcommandGroup),\n\t\t\t]),\n\t\t})\n\t\t.array(),\n]);\n\nexport const chatInputCommandPredicate = baseChatInputCommandPredicate.extend({\n\toptions: chatInputCommandOptionsPredicate.optional(),\n});\n\nexport const chatInputCommandSubcommandGroupPredicate = sharedNameAndDescriptionPredicate.extend({\n\ttype: z.literal(ApplicationCommandOptionType.SubcommandGroup),\n\toptions: z\n\t\t.array(z.object({ type: z.literal(ApplicationCommandOptionType.Subcommand) }))\n\t\t.min(1)\n\t\t.max(25),\n});\n\nexport const chatInputCommandSubcommandPredicate = sharedNameAndDescriptionPredicate.extend({\n\ttype: z.literal(ApplicationCommandOptionType.Subcommand),\n\toptions: z.array(z.object({ type: basicOptionTypesPredicate })).max(25),\n});\n","import type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tAPIApplicationCommandBasicOption,\n\tAPIApplicationCommandOption,\n\tApplicationCommandOptionType,\n} from 'discord-api-types/v10';\nimport type { z } from 'zod';\nimport { validate } from '../../../../util/validation.js';\nimport type { SharedNameAndDescriptionData } from '../../SharedNameAndDescription.js';\nimport { SharedNameAndDescription } from '../../SharedNameAndDescription.js';\nimport { basicOptionPredicate } from '../Assertions.js';\n\nexport interface ApplicationCommandOptionBaseData extends Partial<Pick<APIApplicationCommandOption, 'required'>> {\n\ttype: ApplicationCommandOptionType;\n}\n\n/**\n * The base application command option builder that contains common symbols for application command builders.\n */\nexport abstract class ApplicationCommandOptionBase\n\textends SharedNameAndDescription\n\timplements JSONEncodable<APIApplicationCommandBasicOption>\n{\n\t/**\n\t * @internal\n\t */\n\tprotected static readonly predicate: z.ZodType = basicOptionPredicate;\n\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: ApplicationCommandOptionBaseData & SharedNameAndDescriptionData;\n\n\t/**\n\t * Creates a new application command option builder.\n\t *\n\t * @param type - The type of the option\n\t */\n\tpublic constructor(type: ApplicationCommandOptionType) {\n\t\tsuper();\n\t\tthis.data.type = type;\n\t}\n\n\t/**\n\t * Sets whether this option is required.\n\t *\n\t * @param required - Whether this option should be required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = required;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIApplicationCommandBasicOption {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate((this.constructor as typeof ApplicationCommandOptionBase).predicate, clone, validationOverride);\n\n\t\treturn clone as APIApplicationCommandBasicOption;\n\t}\n}\n","import { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command boolean option.\n */\nexport class ChatInputCommandBooleanOption extends ApplicationCommandOptionBase {\n\t/**\n\t * Creates a new boolean option.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Boolean);\n\t}\n}\n","import { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { channelOptionPredicate } from '../Assertions.js';\nimport { ApplicationCommandOptionChannelTypesMixin } from '../mixins/ApplicationCommandOptionChannelTypesMixin.js';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command channel option.\n *\n * @mixes {@link ApplicationCommandOptionBase}\n * @mixes {@link ApplicationCommandOptionChannelTypesMixin}\n */\nexport class ChatInputCommandChannelOption extends Mixin(\n\tApplicationCommandOptionBase,\n\tApplicationCommandOptionChannelTypesMixin,\n) {\n\t/**\n\t * @internal\n\t */\n\tprotected static override readonly predicate = channelOptionPredicate;\n\n\t/**\n\t * Creates a new channel option.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Channel);\n\t}\n}\n","import { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { integerOptionPredicate } from '../Assertions.js';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command integer option.\n *\n * @mixes {@link ApplicationCommandOptionBase}\n * @mixes {@link ApplicationCommandNumericOptionMinMaxValueMixin}\n * @mixes {@link ApplicationCommandOptionWithAutocompleteMixin}\n * @mixes {@link ApplicationCommandOptionWithChoicesMixin}\\<number\\>\n */\nexport class ChatInputCommandIntegerOption extends Mixin(\n\tApplicationCommandOptionBase,\n\tApplicationCommandNumericOptionMinMaxValueMixin,\n\tApplicationCommandOptionWithAutocompleteMixin,\n\tApplicationCommandOptionWithChoicesMixin<number>,\n) {\n\t/**\n\t * @internal\n\t */\n\tprotected static override readonly predicate = integerOptionPredicate;\n\n\t/**\n\t * Creates a new integer option.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Integer);\n\t}\n}\n","import { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command mentionable option.\n */\nexport class ChatInputCommandMentionableOption extends ApplicationCommandOptionBase {\n\t/**\n\t * Creates a new mentionable option.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Mentionable);\n\t}\n}\n","import { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { numberOptionPredicate } from '../Assertions.js';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command number option.\n *\n * @mixes {@link ApplicationCommandOptionBase}\n * @mixes {@link ApplicationCommandNumericOptionMinMaxValueMixin}\n * @mixes {@link ApplicationCommandOptionWithAutocompleteMixin}\n * @mixes {@link ApplicationCommandOptionWithChoicesMixin}\\<number\\>\n */\nexport class ChatInputCommandNumberOption extends Mixin(\n\tApplicationCommandOptionBase,\n\tApplicationCommandNumericOptionMinMaxValueMixin,\n\tApplicationCommandOptionWithAutocompleteMixin,\n\tApplicationCommandOptionWithChoicesMixin<number>,\n) {\n\t/**\n\t * @internal\n\t */\n\tprotected static override readonly predicate = numberOptionPredicate;\n\n\t/**\n\t * Creates a new number option.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Number);\n\t}\n}\n","import { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command role option.\n */\nexport class ChatInputCommandRoleOption extends ApplicationCommandOptionBase {\n\t/**\n\t * Creates a new role option.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Role);\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandStringOption } from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { stringOptionPredicate } from '../Assertions.js';\nimport type { ApplicationCommandOptionWithAutocompleteData } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport type { ApplicationCommandOptionWithChoicesData } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\nimport type { ApplicationCommandOptionBaseData } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command string option.\n *\n * @mixes {@link ApplicationCommandOptionBase}\n * @mixes {@link ApplicationCommandOptionWithAutocompleteMixin}\n * @mixes {@link ApplicationCommandOptionWithChoicesMixin}\\<string\\>\n */\nexport class ChatInputCommandStringOption extends Mixin(\n\tApplicationCommandOptionBase,\n\tApplicationCommandOptionWithAutocompleteMixin,\n\tApplicationCommandOptionWithChoicesMixin<string>,\n) {\n\t/**\n\t * @internal\n\t */\n\tprotected static override readonly predicate = stringOptionPredicate;\n\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: ApplicationCommandOptionBaseData &\n\t\tApplicationCommandOptionWithAutocompleteData &\n\t\tApplicationCommandOptionWithChoicesData &\n\t\tPartial<Pick<APIApplicationCommandStringOption, 'max_length' | 'min_length'>>;\n\n\t/**\n\t * Creates a new string option builder.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.String);\n\t}\n\n\t/**\n\t * Sets the maximum length of this string option.\n\t *\n\t * @param max - The maximum length this option can be\n\t */\n\tpublic setMaxLength(max: number): this {\n\t\tthis.data.max_length = max;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the maximum length of this string option.\n\t */\n\tpublic clearMaxLength(): this {\n\t\tthis.data.max_length = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum length of this string option.\n\t *\n\t * @param min - The minimum length this option can be\n\t */\n\tpublic setMinLength(min: number): this {\n\t\tthis.data.min_length = min;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the minimum length of this string option.\n\t */\n\tpublic clearMinLength(): this {\n\t\tthis.data.min_length = undefined;\n\t\treturn this;\n\t}\n}\n","import { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command user option.\n */\nexport class ChatInputCommandUserOption extends ApplicationCommandOptionBase {\n\t/**\n\t * Creates a new user option.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.User);\n\t}\n}\n","import { normalizeArray, type RestOrArray } from '../../../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../../../util/resolveBuilder.js';\nimport type { ApplicationCommandOptionBase } from '../options/ApplicationCommandOptionBase.js';\nimport { ChatInputCommandAttachmentOption } from '../options/attachment.js';\nimport { ChatInputCommandBooleanOption } from '../options/boolean.js';\nimport { ChatInputCommandChannelOption } from '../options/channel.js';\nimport { ChatInputCommandIntegerOption } from '../options/integer.js';\nimport { ChatInputCommandMentionableOption } from '../options/mentionable.js';\nimport { ChatInputCommandNumberOption } from '../options/number.js';\nimport { ChatInputCommandRoleOption } from '../options/role.js';\nimport { ChatInputCommandStringOption } from '../options/string.js';\nimport { ChatInputCommandUserOption } from '../options/user.js';\n\nexport interface SharedChatInputCommandOptionsData {\n\toptions?: ApplicationCommandOptionBase[];\n}\n\n/**\n * This mixin holds symbols that can be shared in chat input command options.\n */\nexport class SharedChatInputCommandOptions {\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: SharedChatInputCommandOptionsData;\n\n\t/**\n\t * The options within this command.\n\t */\n\tpublic get options(): readonly ApplicationCommandOptionBase[] {\n\t\treturn (this.data.options ??= []);\n\t}\n\n\t/**\n\t * Adds boolean options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addBooleanOptions(\n\t\t...options: RestOrArray<\n\t\t\tChatInputCommandBooleanOption | ((builder: ChatInputCommandBooleanOption) => ChatInputCommandBooleanOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandBooleanOption, ...options);\n\t}\n\n\t/**\n\t * Adds user options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addUserOptions(\n\t\t...options: RestOrArray<\n\t\t\tChatInputCommandUserOption | ((builder: ChatInputCommandUserOption) => ChatInputCommandUserOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandUserOption, ...options);\n\t}\n\n\t/**\n\t * Adds channel options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addChannelOptions(\n\t\t...options: RestOrArray<\n\t\t\tChatInputCommandChannelOption | ((builder: ChatInputCommandChannelOption) => ChatInputCommandChannelOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandChannelOption, ...options);\n\t}\n\n\t/**\n\t * Adds role options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addRoleOptions(\n\t\t...options: RestOrArray<\n\t\t\tChatInputCommandRoleOption | ((builder: ChatInputCommandRoleOption) => ChatInputCommandRoleOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandRoleOption, ...options);\n\t}\n\n\t/**\n\t * Adds attachment options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addAttachmentOptions(\n\t\t...options: RestOrArray<\n\t\t\t| ChatInputCommandAttachmentOption\n\t\t\t| ((builder: ChatInputCommandAttachmentOption) => ChatInputCommandAttachmentOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandAttachmentOption, ...options);\n\t}\n\n\t/**\n\t * Adds mentionable options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addMentionableOptions(\n\t\t...options: RestOrArray<\n\t\t\t| ChatInputCommandMentionableOption\n\t\t\t| ((builder: ChatInputCommandMentionableOption) => ChatInputCommandMentionableOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandMentionableOption, ...options);\n\t}\n\n\t/**\n\t * Adds string options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addStringOptions(\n\t\t...options: RestOrArray<\n\t\t\tChatInputCommandStringOption | ((builder: ChatInputCommandStringOption) => ChatInputCommandStringOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandStringOption, ...options);\n\t}\n\n\t/**\n\t * Adds integer options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addIntegerOptions(\n\t\t...options: RestOrArray<\n\t\t\tChatInputCommandIntegerOption | ((builder: ChatInputCommandIntegerOption) => ChatInputCommandIntegerOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandIntegerOption, ...options);\n\t}\n\n\t/**\n\t * Adds number options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addNumberOptions(\n\t\t...options: RestOrArray<\n\t\t\tChatInputCommandNumberOption | ((builder: ChatInputCommandNumberOption) => ChatInputCommandNumberOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandNumberOption, ...options);\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts options for this command.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing options for this command.\n\t * @example\n\t * Remove the first option:\n\t * ```ts\n\t * actionRow.spliceOptions(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n options:\n\t * ```ts\n\t * const n = 4;\n\t * actionRow.spliceOptions(0, n);\n\t * ```\n\t * @example\n\t * Remove the last option:\n\t * ```ts\n\t * actionRow.spliceOptions(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of options to remove\n\t * @param options - The replacing option objects\n\t */\n\tpublic spliceOptions(index: number, deleteCount: number, ...options: ApplicationCommandOptionBase[]): this {\n\t\tthis.data.options ??= [];\n\t\tthis.data.options.splice(index, deleteCount, ...options);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Where the actual adding magic happens. ✨\n\t *\n\t * @internal\n\t */\n\tprivate sharedAddOptions<OptionBuilder extends ApplicationCommandOptionBase>(\n\t\tInstance: new () => OptionBuilder,\n\t\t...options: RestOrArray<OptionBuilder | ((builder: OptionBuilder) => OptionBuilder)>\n\t): this {\n\t\tconst normalized = normalizeArray(options);\n\t\tconst resolved = normalized.map((option) => resolveBuilder(option, Instance));\n\n\t\tthis.data.options ??= [];\n\t\tthis.data.options.push(...resolved);\n\n\t\treturn this;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tAPIApplicationCommandSubcommandOption,\n\tAPIApplicationCommandSubcommandGroupOption,\n} from 'discord-api-types/v10';\nimport { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { normalizeArray, type RestOrArray } from '../../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../../util/resolveBuilder.js';\nimport { validate } from '../../../util/validation.js';\nimport type { SharedNameAndDescriptionData } from '../SharedNameAndDescription.js';\nimport { SharedNameAndDescription } from '../SharedNameAndDescription.js';\nimport { chatInputCommandSubcommandGroupPredicate, chatInputCommandSubcommandPredicate } from './Assertions.js';\nimport { SharedChatInputCommandOptions } from './mixins/SharedChatInputCommandOptions.js';\n\nexport interface ChatInputCommandSubcommandGroupData {\n\toptions?: ChatInputCommandSubcommandBuilder[];\n}\n\n/**\n * Represents a folder for subcommands.\n *\n * @see {@link https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups}\n */\nexport class ChatInputCommandSubcommandGroupBuilder\n\textends SharedNameAndDescription\n\timplements JSONEncodable<APIApplicationCommandSubcommandGroupOption>\n{\n\t/**\n\t * The API data associated with this subcommand group.\n\t *\n\t * @internal\n\t */\n\tdeclare protected readonly data: ChatInputCommandSubcommandGroupData & SharedNameAndDescriptionData;\n\n\t/**\n\t * The options within this subcommand group.\n\t */\n\tpublic get options(): readonly ChatInputCommandSubcommandBuilder[] {\n\t\treturn (this.data.options ??= []);\n\t}\n\n\t/**\n\t * Adds a new subcommand to this group.\n\t *\n\t * @param input - A function that returns a subcommand builder or an already built builder\n\t */\n\tpublic addSubcommands(\n\t\t...input: RestOrArray<\n\t\t\t| ChatInputCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: ChatInputCommandSubcommandBuilder) => ChatInputCommandSubcommandBuilder)\n\t\t>\n\t) {\n\t\tconst normalized = normalizeArray(input);\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tconst result = normalized.map((builder) => resolveBuilder(builder, ChatInputCommandSubcommandBuilder));\n\n\t\tthis.data.options ??= [];\n\t\tthis.data.options.push(...result);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIApplicationCommandSubcommandGroupOption {\n\t\tconst { options, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...(structuredClone(rest) as Omit<APIApplicationCommandSubcommandGroupOption, 'type'>),\n\t\t\ttype: ApplicationCommandOptionType.SubcommandGroup as const,\n\t\t\toptions: options?.map((option) => option.toJSON(validationOverride)) ?? [],\n\t\t};\n\n\t\tvalidate(chatInputCommandSubcommandGroupPredicate, data, validationOverride);\n\n\t\treturn data;\n\t}\n}\n\n/**\n * A builder that creates API-compatible JSON data for chat input command subcommands.\n *\n * @mixes {@link SharedNameAndDescription}\n * @mixes {@link SharedChatInputCommandOptions}\n * @see {@link https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups}\n */\nexport class ChatInputCommandSubcommandBuilder\n\textends Mixin(SharedNameAndDescription, SharedChatInputCommandOptions)\n\timplements JSONEncodable<APIApplicationCommandSubcommandOption>\n{\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIApplicationCommandSubcommandOption {\n\t\tconst { options, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...(structuredClone(rest) as Omit<APIApplicationCommandSubcommandOption, 'type'>),\n\t\t\ttype: ApplicationCommandOptionType.Subcommand as const,\n\t\t\toptions: options?.map((option) => option.toJSON(validationOverride)) ?? [],\n\t\t};\n\n\t\tvalidate(chatInputCommandSubcommandPredicate, data, validationOverride);\n\n\t\treturn data;\n\t}\n}\n","import type { RestOrArray } from '../../../../util/normalizeArray.js';\nimport { normalizeArray } from '../../../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../../../util/resolveBuilder.js';\nimport {\n\tChatInputCommandSubcommandGroupBuilder,\n\tChatInputCommandSubcommandBuilder,\n} from '../ChatInputCommandSubcommands.js';\n\nexport interface SharedChatInputCommandSubcommandsData {\n\toptions?: (ChatInputCommandSubcommandBuilder | ChatInputCommandSubcommandGroupBuilder)[];\n}\n\n/**\n * This mixin holds symbols that can be shared in chat input subcommands.\n */\nexport class SharedChatInputCommandSubcommands {\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: SharedChatInputCommandSubcommandsData;\n\n\t/**\n\t * Adds subcommand groups to this command.\n\t *\n\t * @param input - Subcommand groups to add\n\t */\n\tpublic addSubcommandGroups(\n\t\t...input: RestOrArray<\n\t\t\t| ChatInputCommandSubcommandGroupBuilder\n\t\t\t| ((subcommandGroup: ChatInputCommandSubcommandGroupBuilder) => ChatInputCommandSubcommandGroupBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((value) => resolveBuilder(value, ChatInputCommandSubcommandGroupBuilder));\n\n\t\tthis.data.options ??= [];\n\t\tthis.data.options.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds subcommands to this command.\n\t *\n\t * @param input - Subcommands to add\n\t */\n\tpublic addSubcommands(\n\t\t...input: RestOrArray<\n\t\t\t| ChatInputCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: ChatInputCommandSubcommandBuilder) => ChatInputCommandSubcommandBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((value) => resolveBuilder(value, ChatInputCommandSubcommandBuilder));\n\n\t\tthis.data.options ??= [];\n\t\tthis.data.options.push(...resolved);\n\n\t\treturn this;\n\t}\n}\n","import { ApplicationCommandType, type RESTPostAPIChatInputApplicationCommandsJSONBody } from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { validate } from '../../../util/validation.js';\nimport { CommandBuilder } from '../Command.js';\nimport { SharedNameAndDescription } from '../SharedNameAndDescription.js';\nimport { chatInputCommandPredicate } from './Assertions.js';\nimport { SharedChatInputCommandOptions } from './mixins/SharedChatInputCommandOptions.js';\nimport { SharedChatInputCommandSubcommands } from './mixins/SharedSubcommands.js';\n\n/**\n * A builder that creates API-compatible JSON data for chat input commands.\n *\n * @mixes {@link CommandBuilder}\\<{@link discord-api-types/v10#(RESTPostAPIChatInputApplicationCommandsJSONBody:interface)}\\>\n * @mixes {@link SharedChatInputCommandOptions}\n * @mixes {@link SharedNameAndDescription}\n * @mixes {@link SharedChatInputCommandSubcommands}\n */\nexport class ChatInputCommandBuilder extends Mixin(\n\tCommandBuilder<RESTPostAPIChatInputApplicationCommandsJSONBody>,\n\tSharedChatInputCommandOptions,\n\tSharedNameAndDescription,\n\tSharedChatInputCommandSubcommands,\n) {\n\t/**\n\t * {@inheritDoc CommandBuilder.toJSON}\n\t */\n\tpublic toJSON(validationOverride?: boolean): RESTPostAPIChatInputApplicationCommandsJSONBody {\n\t\tconst { options, ...rest } = this.data;\n\n\t\tconst data: RESTPostAPIChatInputApplicationCommandsJSONBody = {\n\t\t\t...structuredClone(rest as Omit<RESTPostAPIChatInputApplicationCommandsJSONBody, 'options'>),\n\t\t\ttype: ApplicationCommandType.ChatInput,\n\t\t\toptions: options?.map((option) => option.toJSON(validationOverride)),\n\t\t};\n\n\t\tvalidate(chatInputCommandPredicate, data, validationOverride);\n\n\t\treturn data;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tApplicationIntegrationType,\n\tInteractionContextType,\n\tPermissions,\n\tRESTPostAPIApplicationCommandsJSONBody,\n} from 'discord-api-types/v10';\nimport type { RestOrArray } from '../../util/normalizeArray.js';\nimport { normalizeArray } from '../../util/normalizeArray.js';\n\nexport interface CommandData extends Partial<\n\tPick<RESTPostAPIApplicationCommandsJSONBody, 'contexts' | 'default_member_permissions' | 'integration_types' | 'nsfw'>\n> {}\n\n/**\n * The base class for all command builders.\n */\nexport abstract class CommandBuilder<\n\tCommand extends RESTPostAPIApplicationCommandsJSONBody,\n> implements JSONEncodable<Command> {\n\t/**\n\t * The API data associated with this command.\n\t *\n\t * @internal\n\t */\n\tdeclare protected readonly data: CommandData;\n\n\t/**\n\t * Sets the contexts of this command.\n\t *\n\t * @param contexts - The contexts\n\t */\n\tpublic setContexts(...contexts: RestOrArray<InteractionContextType>) {\n\t\tthis.data.contexts = normalizeArray(contexts);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the integration types of this command.\n\t *\n\t * @param integrationTypes - The integration types\n\t */\n\tpublic setIntegrationTypes(...integrationTypes: RestOrArray<ApplicationIntegrationType>) {\n\t\tthis.data.integration_types = normalizeArray(integrationTypes);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the default permissions a member should have in order to run the command.\n\t *\n\t * @remarks\n\t * You can set this to `'0'` to disable the command by default.\n\t * @param permissions - The permissions bit field to set\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t */\n\tpublic setDefaultMemberPermissions(permissions: Permissions | bigint | number) {\n\t\tthis.data.default_member_permissions = typeof permissions === 'string' ? permissions : permissions.toString();\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the default permissions a member should have in order to run the command.\n\t */\n\tpublic clearDefaultMemberPermissions() {\n\t\tthis.data.default_member_permissions = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this command is NSFW.\n\t *\n\t * @param nsfw - Whether this command is NSFW\n\t */\n\tpublic setNSFW(nsfw = true) {\n\t\tthis.data.nsfw = nsfw;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic abstract toJSON(validationOverride?: boolean): Command;\n}\n","import { ApplicationCommandType, ApplicationIntegrationType, InteractionContextType } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { localeMapPredicate, memberPermissionsPredicate } from '../../../Assertions.js';\n\nconst namePredicate = z\n\t.string()\n\t.min(1)\n\t.max(32)\n\t.refine((val) => val.trim().length > 0, {\n\t\terror: 'Must not consist of only whitespace.',\n\t});\n\nconst contextsPredicate = z.array(z.enum(InteractionContextType));\nconst integrationTypesPredicate = z.array(z.enum(ApplicationIntegrationType));\n\nconst baseContextMenuCommandPredicate = z.object({\n\tcontexts: contextsPredicate.optional(),\n\tdefault_member_permissions: memberPermissionsPredicate.optional(),\n\tname: namePredicate,\n\tname_localizations: localeMapPredicate.optional(),\n\tintegration_types: integrationTypesPredicate.optional(),\n\tnsfw: z.boolean().optional(),\n});\n\nexport const userCommandPredicate = baseContextMenuCommandPredicate.extend({\n\ttype: z.literal(ApplicationCommandType.User),\n});\n\nexport const messageCommandPredicate = baseContextMenuCommandPredicate.extend({\n\ttype: z.literal(ApplicationCommandType.Message),\n});\n","import type { ApplicationCommandType, RESTPostAPIContextMenuApplicationCommandsJSONBody } from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { CommandBuilder } from '../Command.js';\nimport { SharedName } from '../SharedName.js';\n\n/**\n * The type a context menu command can be.\n */\nexport type ContextMenuCommandType = ApplicationCommandType.Message | ApplicationCommandType.User;\n\n/**\n * A builder that creates API-compatible JSON data for context menu commands.\n *\n * @mixes {@link CommandBuilder}\\<{@link discord-api-types/v10#(RESTPostAPIContextMenuApplicationCommandsJSONBody:interface)}\\>\n * @mixes {@link SharedName}\n */\nexport abstract class ContextMenuCommandBuilder extends Mixin(\n\tCommandBuilder<RESTPostAPIContextMenuApplicationCommandsJSONBody>,\n\tSharedName,\n) {\n\t/**\n\t * The API data associated with this context menu command.\n\t *\n\t * @internal\n\t */\n\tprotected override readonly data: Partial<RESTPostAPIContextMenuApplicationCommandsJSONBody>;\n\n\t/**\n\t * Creates a new context menu command.\n\t *\n\t * @param data - The API data to create this context menu command with\n\t */\n\tpublic constructor(data: Partial<RESTPostAPIContextMenuApplicationCommandsJSONBody> = {}) {\n\t\tsuper();\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * {@inheritDoc CommandBuilder.toJSON}\n\t */\n\tpublic abstract override toJSON(validationOverride?: boolean): RESTPostAPIContextMenuApplicationCommandsJSONBody;\n}\n","import { ApplicationCommandType, type RESTPostAPIContextMenuApplicationCommandsJSONBody } from 'discord-api-types/v10';\nimport { validate } from '../../../util/validation.js';\nimport { messageCommandPredicate } from './Assertions.js';\nimport { ContextMenuCommandBuilder } from './ContextMenuCommand.js';\n\n/**\n * A builder that creates API-compatible JSON data for message context menu commands.\n */\nexport class MessageContextCommandBuilder extends ContextMenuCommandBuilder {\n\t/**\n\t * {@inheritDoc CommandBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): RESTPostAPIContextMenuApplicationCommandsJSONBody {\n\t\tconst data = { ...structuredClone(this.data), type: ApplicationCommandType.Message };\n\t\tvalidate(messageCommandPredicate, data, validationOverride);\n\n\t\treturn data as RESTPostAPIContextMenuApplicationCommandsJSONBody;\n\t}\n}\n","import { ApplicationCommandType, type RESTPostAPIContextMenuApplicationCommandsJSONBody } from 'discord-api-types/v10';\nimport { validate } from '../../../util/validation.js';\nimport { userCommandPredicate } from './Assertions.js';\nimport { ContextMenuCommandBuilder } from './ContextMenuCommand.js';\n\n/**\n * A builder that creates API-compatible JSON data for user context menu commands.\n */\nexport class UserContextCommandBuilder extends ContextMenuCommandBuilder {\n\t/**\n\t * {@inheritDoc CommandBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): RESTPostAPIContextMenuApplicationCommandsJSONBody {\n\t\tconst data = { ...structuredClone(this.data), type: ApplicationCommandType.User };\n\t\tvalidate(userCommandPredicate, data, validationOverride);\n\n\t\treturn data as RESTPostAPIContextMenuApplicationCommandsJSONBody;\n\t}\n}\n","import { ComponentType } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { customIdPredicate } from '../../Assertions.js';\nimport { labelPredicate } from '../../components/label/Assertions.js';\nimport { textDisplayPredicate } from '../../components/v2/Assertions.js';\n\nconst titlePredicate = z.string().min(1).max(45);\n\nexport const modalPredicate = z.object({\n\ttitle: titlePredicate,\n\tcustom_id: customIdPredicate,\n\tcomponents: z\n\t\t.union([\n\t\t\tz.object({\n\t\t\t\ttype: z.literal(ComponentType.ActionRow),\n\t\t\t\tcomponents: z\n\t\t\t\t\t.object({ type: z.literal(ComponentType.TextInput) })\n\t\t\t\t\t.array()\n\t\t\t\t\t.length(1),\n\t\t\t}),\n\t\t\tlabelPredicate,\n\t\t\ttextDisplayPredicate,\n\t\t])\n\t\t.array()\n\t\t.min(1)\n\t\t.max(5),\n});\n","import type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tAPILabelComponent,\n\tAPIModalInteractionResponseCallbackData,\n\tAPITextDisplayComponent,\n} from 'discord-api-types/v10';\nimport type { ActionRowBuilder } from '../../components/ActionRow.js';\nimport type { AnyModalComponentBuilder } from '../../components/Components.js';\nimport { createComponentBuilder } from '../../components/Components.js';\nimport { LabelBuilder } from '../../components/label/Label.js';\nimport { TextDisplayBuilder } from '../../components/v2/TextDisplay.js';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../util/resolveBuilder.js';\nimport { validate } from '../../util/validation.js';\nimport { modalPredicate } from './Assertions.js';\n\nexport interface ModalBuilderData extends Partial<Omit<APIModalInteractionResponseCallbackData, 'components'>> {\n\tcomponents: (ActionRowBuilder | AnyModalComponentBuilder)[];\n}\n\n/**\n * A builder that creates API-compatible JSON data for modals.\n */\nexport class ModalBuilder implements JSONEncodable<APIModalInteractionResponseCallbackData> {\n\t/**\n\t * The API data associated with this modal.\n\t */\n\tprivate readonly data: ModalBuilderData;\n\n\t/**\n\t * The components within this modal.\n\t */\n\tpublic get components(): readonly (ActionRowBuilder | AnyModalComponentBuilder)[] {\n\t\treturn this.data.components;\n\t}\n\n\t/**\n\t * Creates a new modal.\n\t *\n\t * @param data - The API data to create this modal with\n\t */\n\tpublic constructor(data: Partial<APIModalInteractionResponseCallbackData> = {}) {\n\t\tconst { components = [], ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tcomponents: components.map((component) => createComponentBuilder(component)),\n\t\t};\n\t}\n\n\t/**\n\t * Sets the title of this modal.\n\t *\n\t * @param title - The title to use\n\t */\n\tpublic setTitle(title: string) {\n\t\tthis.data.title = title;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom id of this modal.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customId;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds label components to this modal.\n\t *\n\t * @param components - The components to add\n\t */\n\tpublic addLabelComponents(\n\t\t...components: RestOrArray<APILabelComponent | LabelBuilder | ((builder: LabelBuilder) => LabelBuilder)>\n\t) {\n\t\tconst normalized = normalizeArray(components);\n\t\tconst resolved = normalized.map((label) => resolveBuilder(label, LabelBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds text display components to this modal.\n\t *\n\t * @param components - The components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t) {\n\t\tconst normalized = normalizeArray(components);\n\t\tconst resolved = normalized.map((row) => resolveBuilder(row, TextDisplayBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts components for this modal.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t * The maximum amount of components that can be added is 5.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing components of a modal.\n\t * @example\n\t * Remove the first component:\n\t * ```ts\n\t * modal.spliceComponents(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n components:\n\t * ```ts\n\t * const n = 4;\n\t * modal.spliceComponents(0, n);\n\t * ```\n\t * @example\n\t * Remove the last component:\n\t * ```ts\n\t * modal.spliceComponents(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of components to remove\n\t * @param components - The replacing components\n\t */\n\tpublic spliceComponents(index: number, deleteCount: number, ...components: AnyModalComponentBuilder[]): this {\n\t\tthis.data.components.splice(index, deleteCount, ...components);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIModalInteractionResponseCallbackData {\n\t\tconst { components, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\tcomponents: components.map((component) => component.toJSON(validationOverride)),\n\t\t};\n\n\t\tvalidate(modalPredicate, data, validationOverride);\n\n\t\treturn data as APIModalInteractionResponseCallbackData;\n\t}\n}\n","import { embedLength } from '@discordjs/util';\nimport { z } from 'zod';\n\nconst namePredicate = z.string().max(256);\n\nconst URLPredicate = z.url({ protocol: /^https?$/ });\n\nconst URLWithAttachmentProtocolPredicate = z.url({ protocol: /^(?:https?|attachment)$/ });\n\nexport const embedFieldPredicate = z.object({\n\tname: namePredicate,\n\tvalue: z.string().max(1_024),\n\tinline: z.boolean().optional(),\n});\n\nexport const embedAuthorPredicate = z.object({\n\tname: namePredicate.min(1),\n\ticon_url: URLWithAttachmentProtocolPredicate.optional(),\n\turl: URLPredicate.optional(),\n});\n\nexport const embedFooterPredicate = z.object({\n\ttext: z.string().min(1).max(2_048),\n\ticon_url: URLWithAttachmentProtocolPredicate.optional(),\n});\n\nexport const embedPredicate = z\n\t.object({\n\t\ttitle: namePredicate.min(1).optional(),\n\t\tdescription: z.string().min(1).max(4_096).optional(),\n\t\turl: URLPredicate.optional(),\n\t\ttimestamp: z.string().optional(),\n\t\tcolor: z.int().min(0).max(0xffffff).optional(),\n\t\tfooter: embedFooterPredicate.optional(),\n\t\timage: z.object({ url: URLWithAttachmentProtocolPredicate }).optional(),\n\t\tthumbnail: z.object({ url: URLWithAttachmentProtocolPredicate }).optional(),\n\t\tauthor: embedAuthorPredicate.optional(),\n\t\tfields: z.array(embedFieldPredicate).max(25).optional(),\n\t})\n\t.refine(\n\t\t(embed) =>\n\t\t\tembed.title !== undefined ||\n\t\t\tembed.description !== undefined ||\n\t\t\t(embed.fields !== undefined && embed.fields.length > 0) ||\n\t\t\tembed.footer !== undefined ||\n\t\t\tembed.author !== undefined ||\n\t\t\tembed.image !== undefined ||\n\t\t\tembed.thumbnail !== undefined,\n\t\t{\n\t\t\terror: 'Embed must have at least a title, description, a field, a footer, an author, an image, OR a thumbnail.',\n\t\t},\n\t)\n\t.refine((embed) => embedLength(embed) <= 6_000, { error: 'Embeds must not exceed 6000 characters in total.' });\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIEmbedAuthor } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { embedAuthorPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for the embed author.\n */\nexport class EmbedAuthorBuilder implements JSONEncodable<APIEmbedAuthor> {\n\t/**\n\t * The API data associated with this embed author.\n\t */\n\tprivate readonly data: Partial<APIEmbedAuthor>;\n\n\t/**\n\t * Creates a new embed author.\n\t *\n\t * @param data - The API data to create this embed author with\n\t */\n\tpublic constructor(data: Partial<APIEmbedAuthor> = {}) {\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * Sets the name for this embed author.\n\t *\n\t * @param name - The name to use\n\t */\n\tpublic setName(name: string): this {\n\t\tthis.data.name = name;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the URL for this embed author.\n\t *\n\t * @param url - The url to use\n\t */\n\tpublic setURL(url: string): this {\n\t\tthis.data.url = url;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the URL for this embed author.\n\t */\n\tpublic clearURL(): this {\n\t\tthis.data.url = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the icon URL for this embed author.\n\t *\n\t * @param iconURL - The icon URL to use\n\t */\n\tpublic setIconURL(iconURL: string): this {\n\t\tthis.data.icon_url = iconURL;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the icon URL for this embed author.\n\t */\n\tpublic clearIconURL(): this {\n\t\tthis.data.icon_url = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIEmbedAuthor {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(embedAuthorPredicate, clone, validationOverride);\n\n\t\treturn clone as APIEmbedAuthor;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIEmbedField } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { embedFieldPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for embed fields.\n */\nexport class EmbedFieldBuilder implements JSONEncodable<APIEmbedField> {\n\t/**\n\t * The API data associated with this embed field.\n\t */\n\tprivate readonly data: Partial<APIEmbedField>;\n\n\t/**\n\t * Creates a new embed field.\n\t *\n\t * @param data - The API data to create this embed field with\n\t */\n\tpublic constructor(data: Partial<APIEmbedField> = {}) {\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * Sets the name for this embed field.\n\t *\n\t * @param name - The name to use\n\t */\n\tpublic setName(name: string): this {\n\t\tthis.data.name = name;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value for this embed field.\n\t *\n\t * @param value - The value to use\n\t */\n\tpublic setValue(value: string): this {\n\t\tthis.data.value = value;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this field should display inline.\n\t *\n\t * @param inline - Whether this field should display inline\n\t */\n\tpublic setInline(inline = true): this {\n\t\tthis.data.inline = inline;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIEmbedField {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(embedFieldPredicate, clone, validationOverride);\n\n\t\treturn clone as APIEmbedField;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIEmbedFooter } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { embedFooterPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for the embed footer.\n */\nexport class EmbedFooterBuilder implements JSONEncodable<APIEmbedFooter> {\n\t/**\n\t * The API data associated with this embed footer.\n\t */\n\tprivate readonly data: Partial<APIEmbedFooter>;\n\n\t/**\n\t * Creates a new embed footer.\n\t *\n\t * @param data - The API data to create this embed footer with\n\t */\n\tpublic constructor(data: Partial<APIEmbedFooter> = {}) {\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * Sets the text for this embed footer.\n\t *\n\t * @param text - The text to use\n\t */\n\tpublic setText(text: string): this {\n\t\tthis.data.text = text;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the url for this embed footer.\n\t *\n\t * @param url - The url to use\n\t */\n\tpublic setIconURL(url: string): this {\n\t\tthis.data.icon_url = url;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the icon URL for this embed footer.\n\t */\n\tpublic clearIconURL(): this {\n\t\tthis.data.icon_url = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIEmbedFooter {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(embedFooterPredicate, clone, validationOverride);\n\n\t\treturn clone as APIEmbedFooter;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIEmbed, APIEmbedAuthor, APIEmbedField, APIEmbedFooter } from 'discord-api-types/v10';\nimport type { RestOrArray } from '../../util/normalizeArray.js';\nimport { normalizeArray } from '../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../util/resolveBuilder.js';\nimport { validate } from '../../util/validation.js';\nimport { embedPredicate } from './Assertions.js';\nimport { EmbedAuthorBuilder } from './EmbedAuthor.js';\nimport { EmbedFieldBuilder } from './EmbedField.js';\nimport { EmbedFooterBuilder } from './EmbedFooter.js';\n\n/**\n * Data stored in the process of constructing an embed.\n */\nexport interface EmbedBuilderData extends Omit<APIEmbed, 'author' | 'fields' | 'footer'> {\n\tauthor?: EmbedAuthorBuilder;\n\tfields: EmbedFieldBuilder[];\n\tfooter?: EmbedFooterBuilder;\n}\n\n/**\n * A builder that creates API-compatible JSON data for embeds.\n */\nexport class EmbedBuilder implements JSONEncodable<APIEmbed> {\n\t/**\n\t * The API data associated with this embed.\n\t */\n\tprivate readonly data: EmbedBuilderData;\n\n\t/**\n\t * Gets the fields of this embed.\n\t */\n\tpublic get fields(): readonly EmbedFieldBuilder[] {\n\t\treturn this.data.fields;\n\t}\n\n\t/**\n\t * Creates a new embed.\n\t *\n\t * @param data - The API data to create this embed with\n\t */\n\tpublic constructor(data: Partial<APIEmbed> = {}) {\n\t\tconst { author, fields = [], footer, ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tauthor: author && new EmbedAuthorBuilder(author),\n\t\t\tfields: fields.map((field) => new EmbedFieldBuilder(field)),\n\t\t\tfooter: footer && new EmbedFooterBuilder(footer),\n\t\t};\n\t}\n\n\t/**\n\t * Appends fields to the embed.\n\t *\n\t * @remarks\n\t * This method accepts either an array of fields or a variable number of field parameters.\n\t * The maximum amount of fields that can be added is 25.\n\t * @example\n\t * Using an array:\n\t * ```ts\n\t * const fields: APIEmbedField[] = ...;\n\t * const embed = new EmbedBuilder()\n\t * \t.addFields(fields);\n\t * ```\n\t * @example\n\t * Using rest parameters (variadic):\n\t * ```ts\n\t * const embed = new EmbedBuilder()\n\t * \t.addFields(\n\t * \t\t{ name: 'Field 1', value: 'Value 1' },\n\t * \t\t{ name: 'Field 2', value: 'Value 2' },\n\t * \t);\n\t * ```\n\t * @param fields - The fields to add\n\t */\n\tpublic addFields(\n\t\t...fields: RestOrArray<APIEmbedField | EmbedFieldBuilder | ((builder: EmbedFieldBuilder) => EmbedFieldBuilder)>\n\t): this {\n\t\tconst normalizedFields = normalizeArray(fields);\n\t\tconst resolved = normalizedFields.map((field) => resolveBuilder(field, EmbedFieldBuilder));\n\n\t\tthis.data.fields.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts fields for this embed.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t * The maximum amount of fields that can be added is 25.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing fields of an embed.\n\t * @example\n\t * Remove the first field:\n\t * ```ts\n\t * embed.spliceFields(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n fields:\n\t * ```ts\n\t * const n = 4;\n\t * embed.spliceFields(0, n);\n\t * ```\n\t * @example\n\t * Remove the last field:\n\t * ```ts\n\t * embed.spliceFields(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of fields to remove\n\t * @param fields - The replacing field objects\n\t */\n\tpublic spliceFields(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...fields: (APIEmbedField | EmbedFieldBuilder | ((builder: EmbedFieldBuilder) => EmbedFieldBuilder))[]\n\t): this {\n\t\tconst resolved = fields.map((field) => resolveBuilder(field, EmbedFieldBuilder));\n\t\tthis.data.fields.splice(index, deleteCount, ...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the fields for this embed.\n\t *\n\t * @remarks\n\t * This method is an alias for {@link EmbedBuilder.spliceFields}. More specifically,\n\t * it splices the entire array of fields, replacing them with the provided fields.\n\t *\n\t * You can set a maximum of 25 fields.\n\t * @param fields - The fields to set\n\t */\n\tpublic setFields(\n\t\t...fields: RestOrArray<APIEmbedField | EmbedFieldBuilder | ((builder: EmbedFieldBuilder) => EmbedFieldBuilder)>\n\t): this {\n\t\tthis.spliceFields(0, this.data.fields.length, ...normalizeArray(fields));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the author of this embed.\n\t *\n\t * @param options - The options to use\n\t */\n\tpublic setAuthor(\n\t\toptions: APIEmbedAuthor | EmbedAuthorBuilder | ((builder: EmbedAuthorBuilder) => EmbedAuthorBuilder),\n\t): this {\n\t\tthis.data.author = resolveBuilder(options, EmbedAuthorBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the author of this embed (and creates it if it doesn't exist).\n\t *\n\t * @param updater - The function to update the author with\n\t */\n\tpublic updateAuthor(updater: (builder: EmbedAuthorBuilder) => void) {\n\t\tupdater((this.data.author ??= new EmbedAuthorBuilder()));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the author of this embed.\n\t */\n\tpublic clearAuthor(): this {\n\t\tthis.data.author = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the color of this embed.\n\t *\n\t * @param color - The color to use\n\t */\n\tpublic setColor(color: number): this {\n\t\tthis.data.color = color;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the color of this embed.\n\t */\n\tpublic clearColor(): this {\n\t\tthis.data.color = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this embed.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string): this {\n\t\tthis.data.description = description;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description of this embed.\n\t */\n\tpublic clearDescription(): this {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the footer of this embed.\n\t *\n\t * @param options - The footer to use\n\t */\n\tpublic setFooter(\n\t\toptions: APIEmbedFooter | EmbedFooterBuilder | ((builder: EmbedFooterBuilder) => EmbedFooterBuilder),\n\t): this {\n\t\tthis.data.footer = resolveBuilder(options, EmbedFooterBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the footer of this embed (and creates it if it doesn't exist).\n\t *\n\t * @param updater - The function to update the footer with\n\t */\n\tpublic updateFooter(updater: (builder: EmbedFooterBuilder) => void) {\n\t\tupdater((this.data.footer ??= new EmbedFooterBuilder()));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the footer of this embed.\n\t */\n\tpublic clearFooter(): this {\n\t\tthis.data.footer = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the image of this embed.\n\t *\n\t * @param url - The image URL to use\n\t */\n\tpublic setImage(url: string): this {\n\t\tthis.data.image = { url };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the image of this embed.\n\t */\n\tpublic clearImage(): this {\n\t\tthis.data.image = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the thumbnail of this embed.\n\t *\n\t * @param url - The thumbnail URL to use\n\t */\n\tpublic setThumbnail(url: string): this {\n\t\tthis.data.thumbnail = { url };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the thumbnail of this embed.\n\t */\n\tpublic clearThumbnail(): this {\n\t\tthis.data.thumbnail = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the timestamp of this embed.\n\t *\n\t * @param timestamp - The timestamp or date to use\n\t */\n\tpublic setTimestamp(timestamp: Date | number | string = Date.now()): this {\n\t\tthis.data.timestamp = new Date(timestamp).toISOString();\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the timestamp of this embed.\n\t */\n\tpublic clearTimestamp(): this {\n\t\tthis.data.timestamp = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the title for this embed.\n\t *\n\t * @param title - The title to use\n\t */\n\tpublic setTitle(title: string): this {\n\t\tthis.data.title = title;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the title of this embed.\n\t */\n\tpublic clearTitle(): this {\n\t\tthis.data.title = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the URL of this embed.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string): this {\n\t\tthis.data.url = url;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the URL of this embed.\n\t */\n\tpublic clearURL(): this {\n\t\tthis.data.url = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIEmbed {\n\t\tconst { author, fields, footer, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\t// Disable validation because the embedPredicate below will validate those as well\n\t\t\tauthor: author?.toJSON(false),\n\t\t\tfields: fields.map((field) => field.toJSON(false)),\n\t\t\tfooter: footer?.toJSON(false),\n\t\t};\n\n\t\tvalidate(embedPredicate, data, validationOverride);\n\n\t\treturn data;\n\t}\n}\n","import { PollLayoutType } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { emojiPredicate } from '../../components/Assertions';\n\nexport const pollQuestionPredicate = z.object({ text: z.string().min(1).max(300) });\n\nexport const pollAnswerMediaPredicate = z.object({\n\ttext: z.string().min(1).max(55),\n\temoji: emojiPredicate.optional(),\n});\n\nexport const pollAnswerPredicate = z.object({ poll_media: pollAnswerMediaPredicate });\n\nexport const pollPredicate = z.object({\n\tquestion: pollQuestionPredicate,\n\tanswers: z.array(pollAnswerPredicate).min(1).max(10),\n\tduration: z.number().min(1).max(768).optional(),\n\tallow_multiselect: z.boolean().optional(),\n\tlayout_type: z.enum(PollLayoutType).optional(),\n});\n","import type { APIPollMedia } from 'discord-api-types/v10';\n\n/**\n * The base poll media builder that contains common symbols for poll media builders.\n */\nexport abstract class PollMediaBuilder {\n\t/**\n\t * The API data associated with this poll media.\n\t *\n\t * @internal\n\t */\n\tprotected readonly data: Partial<APIPollMedia>;\n\n\t/**\n\t * Creates new poll media.\n\t *\n\t * @param data - The API data to create this poll media with\n\t */\n\tpublic constructor(data: Partial<APIPollMedia> = {}) {\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * Sets the text for this poll media.\n\t *\n\t * @param text - The text to use\n\t */\n\tpublic setText(text: string): this {\n\t\tthis.data.text = text;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic abstract toJSON(validationOverride?: boolean): APIPollMedia;\n}\n","import type { APIPartialEmoji, APIPollMedia } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { pollAnswerMediaPredicate } from './Assertions.js';\nimport { PollMediaBuilder } from './PollMedia.js';\n\n/**\n * A builder that creates API-compatible JSON data for the media of a poll answer.\n */\nexport class PollAnswerMediaBuilder extends PollMediaBuilder {\n\t/**\n\t * Sets the emoji for this poll answer media.\n\t *\n\t * @param emoji - The emoji to use\n\t */\n\tpublic setEmoji(emoji: APIPartialEmoji): this {\n\t\tthis.data.emoji = emoji;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the emoji for this poll answer media.\n\t */\n\tpublic clearEmoji(): this {\n\t\tthis.data.emoji = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc PollMediaBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIPollMedia {\n\t\tconst clone = structuredClone(this.data);\n\n\t\tvalidate(pollAnswerMediaPredicate, clone, validationOverride);\n\n\t\treturn clone;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIPollAnswer, APIPollMedia } from 'discord-api-types/v10';\nimport { resolveBuilder } from '../../util/resolveBuilder';\nimport { validate } from '../../util/validation';\nimport { pollAnswerPredicate } from './Assertions';\nimport { PollAnswerMediaBuilder } from './PollAnswerMedia';\n\nexport interface PollAnswerData extends Omit<APIPollAnswer, 'answer_id' | 'poll_media'> {\n\tpoll_media: PollAnswerMediaBuilder;\n}\n\n/**\n * A builder that creates API-compatible JSON data for poll answers.\n */\nexport class PollAnswerBuilder implements JSONEncodable<Omit<APIPollAnswer, 'answer_id'>> {\n\t/**\n\t * The API data associated with this poll answer.\n\t */\n\tprivate readonly data: PollAnswerData;\n\n\t/**\n\t * Creates a new poll answer.\n\t *\n\t * @param data - The API data to create this poll answer with\n\t */\n\tpublic constructor(data: Partial<Omit<APIPollAnswer, 'answer_id'>> = {}) {\n\t\tconst { poll_media, ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tpoll_media: new PollAnswerMediaBuilder(poll_media),\n\t\t};\n\t}\n\n\t/**\n\t * Sets the media for this poll answer.\n\t *\n\t * @param options - The data to use for this poll answer's media\n\t */\n\tpublic setMedia(\n\t\toptions: APIPollMedia | PollAnswerMediaBuilder | ((builder: PollAnswerMediaBuilder) => PollAnswerMediaBuilder),\n\t): this {\n\t\tthis.data.poll_media = resolveBuilder(options, PollAnswerMediaBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the media of this poll answer.\n\t *\n\t * @param updater - The function to update the media with\n\t */\n\tpublic updateMedia(updater: (builder: PollAnswerMediaBuilder) => void): this {\n\t\tupdater(this.data.poll_media);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): Omit<APIPollAnswer, 'answer_id'> {\n\t\tconst { poll_media, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\t// Disable validation because the pollAnswerPredicate below will validate this as well\n\t\t\tpoll_media: poll_media.toJSON(false),\n\t\t};\n\n\t\tvalidate(pollAnswerPredicate, data, validationOverride);\n\n\t\treturn data;\n\t}\n}\n","import type { APIPollMedia } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { pollQuestionPredicate } from './Assertions.js';\nimport { PollMediaBuilder } from './PollMedia.js';\n\n/**\n * A builder that creates API-compatible JSON data for a poll question.\n */\nexport class PollQuestionBuilder extends PollMediaBuilder {\n\t/**\n\t * {@inheritDoc PollMediaBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): Omit<APIPollMedia, 'emoji'> {\n\t\tconst clone = structuredClone(this.data);\n\n\t\tvalidate(pollQuestionPredicate, clone, validationOverride);\n\n\t\treturn clone;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { RESTAPIPoll, APIPollMedia, PollLayoutType, APIPollAnswer } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../util/resolveBuilder.js';\nimport { validate } from '../../util/validation.js';\nimport { pollPredicate } from './Assertions';\nimport { PollAnswerBuilder } from './PollAnswer.js';\nimport { PollQuestionBuilder } from './PollQuestion.js';\n\nexport interface PollData extends Omit<RESTAPIPoll, 'answers' | 'question'> {\n\tanswers: PollAnswerBuilder[];\n\tquestion: PollQuestionBuilder;\n}\n\n/**\n * A builder that creates API-compatible JSON data for polls.\n */\nexport class PollBuilder implements JSONEncodable<RESTAPIPoll> {\n\t/**\n\t * The API data associated with this poll.\n\t */\n\tprivate readonly data: PollData;\n\n\t/**\n\t * Gets the answers of this poll.\n\t */\n\tpublic get answers(): readonly PollAnswerBuilder[] {\n\t\treturn this.data.answers;\n\t}\n\n\t/**\n\t * Creates a new poll.\n\t *\n\t * @param data - The API data to create this poll with\n\t */\n\tpublic constructor(data: Partial<RESTAPIPoll> = {}) {\n\t\tconst { question, answers = [], ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tquestion: new PollQuestionBuilder(question),\n\t\t\tanswers: answers.map((answer) => new PollAnswerBuilder(answer)),\n\t\t};\n\t}\n\n\t/**\n\t * Appends answers to the poll.\n\t *\n\t * @remarks\n\t * This method accepts either an array of answers or a variable number of answer parameters.\n\t * The maximum amount of answers that can be added is 10.\n\t * @example\n\t * Using an array:\n\t * ```ts\n\t * const answers: APIPollMedia[] = ...;\n\t * const poll = new PollBuilder()\n\t * \t.addAnswers(answers);\n\t * ```\n\t * @example\n\t * Using rest parameters (variadic):\n\t * ```ts\n\t * const poll = new PollBuilder()\n\t * \t.addAnswers(\n\t * \t\t{ text: 'Answer 1' },\n\t * \t\t{ text: 'Answer 2' },\n\t * \t);\n\t * ```\n\t * @param answers - The answers to add\n\t */\n\tpublic addAnswers(\n\t\t...answers: RestOrArray<\n\t\t\tOmit<APIPollAnswer, 'answer_id'> | PollAnswerBuilder | ((builder: PollAnswerBuilder) => PollAnswerBuilder)\n\t\t>\n\t): this {\n\t\tconst normalizedAnswers = normalizeArray(answers);\n\t\tconst resolved = normalizedAnswers.map((answer) => resolveBuilder(answer, PollAnswerBuilder));\n\n\t\tthis.data.answers.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts answers for this poll.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t * The maximum amount of answers that can be added is 10.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing answers of a poll.\n\t * @example\n\t * Remove the first answer:\n\t * ```ts\n\t * poll.spliceAnswers(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n answers:\n\t * ```ts\n\t * const n = 4;\n\t * poll.spliceAnswers(0, n);\n\t * ```\n\t * @example\n\t * Remove the last answer:\n\t * ```ts\n\t * poll.spliceAnswers(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of answers to remove\n\t * @param answers - The replacing answer objects\n\t */\n\tpublic spliceAnswers(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...answers: (\n\t\t\t| Omit<APIPollAnswer, 'answer_id'>\n\t\t\t| PollAnswerBuilder\n\t\t\t| ((builder: PollAnswerBuilder) => PollAnswerBuilder)\n\t\t)[]\n\t): this {\n\t\tconst normalizedAnswers = normalizeArray(answers);\n\t\tconst resolved = normalizedAnswers.map((answer) => resolveBuilder(answer, PollAnswerBuilder));\n\n\t\tthis.data.answers.splice(index, deleteCount, ...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the answers for this poll.\n\t *\n\t * @remarks\n\t * This method is an alias for {@link PollBuilder.spliceAnswers}. More specifically,\n\t * it splices the entire array of answers, replacing them with the provided answers.\n\t *\n\t * You can set a maximum of 10 answers.\n\t * @param answers - The answers to set\n\t */\n\tpublic setAnswers(\n\t\t...answers: RestOrArray<\n\t\t\tOmit<APIPollAnswer, 'answer_id'> | PollAnswerBuilder | ((builder: PollAnswerBuilder) => PollAnswerBuilder)\n\t\t>\n\t): this {\n\t\treturn this.spliceAnswers(0, this.data.answers.length, ...normalizeArray(answers));\n\t}\n\n\t/**\n\t * Sets the question for this poll.\n\t *\n\t * @param options - The data to use for this poll's question\n\t */\n\tpublic setQuestion(\n\t\toptions:\n\t\t\t| Omit<APIPollMedia, 'emoji'>\n\t\t\t| PollQuestionBuilder\n\t\t\t| ((builder: PollQuestionBuilder) => PollQuestionBuilder),\n\t): this {\n\t\tthis.data.question = resolveBuilder(options, PollQuestionBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the question of this poll.\n\t *\n\t * @param updater - The function to update the question with\n\t */\n\tpublic updateQuestion(updater: (builder: PollQuestionBuilder) => void): this {\n\t\tupdater(this.data.question);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the layout type for this poll.\n\t *\n\t * @remarks\n\t * This method is redundant while only one type of poll layout exists (`PollLayoutType.Default`)\n\t * with Discord using that as the layout type if none is specified.\n\t * @param type - The type of poll layout to use\n\t */\n\tpublic setLayoutType(type: PollLayoutType): this {\n\t\tthis.data.layout_type = type;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the layout type for this poll.\n\t */\n\tpublic clearLayoutType(): this {\n\t\tthis.data.layout_type = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether multi-select is enabled for this poll.\n\t *\n\t * @param multiSelect - Whether to allow multi-select\n\t */\n\tpublic setMultiSelect(multiSelect = true): this {\n\t\tthis.data.allow_multiselect = multiSelect;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets how long this poll will be open for in hours.\n\t *\n\t * @remarks\n\t * Minimum duration is `1`, with maximum duration being `768` (32 days).\n\t * Default if none specified is `24` (one day).\n\t * @param duration - The amount of hours this poll will be open for\n\t */\n\tpublic setDuration(duration: number): this {\n\t\tthis.data.duration = duration;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the duration for this poll.\n\t */\n\tpublic clearDuration(): this {\n\t\tthis.data.duration = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): RESTAPIPoll {\n\t\tconst { answers, question, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\t// Disable validation because the pollPredicate below will validate those as well\n\t\t\tanswers: answers.map((answer) => answer.toJSON(false)),\n\t\t\tquestion: question.toJSON(false),\n\t\t};\n\n\t\tvalidate(pollPredicate, data, validationOverride);\n\n\t\treturn data;\n\t}\n}\n","import { Buffer } from 'node:buffer';\nimport { AllowedMentionsTypes, ComponentType, MessageFlags, MessageReferenceType } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { snowflakePredicate } from '../Assertions.js';\nimport { embedPredicate } from './embed/Assertions.js';\nimport { pollPredicate } from './poll/Assertions.js';\n\nconst fileKeyRegex = /^files\\[(?<placeholder>\\d+?)]$/;\n\nexport const rawFilePredicate = z.object({\n\tdata: z.union([z.instanceof(Buffer), z.instanceof(Uint8Array), z.string()]),\n\tname: z.string().min(1),\n\tcontentType: z.string().optional(),\n\tkey: z.string().regex(fileKeyRegex).optional(),\n});\n\nexport const attachmentPredicate = z.object({\n\t// As a string it only makes sense for edits when we do have an attachment snowflake\n\tid: z.union([snowflakePredicate, z.number()]),\n\tdescription: z.string().max(1_024).optional(),\n\tduration_secs: z\n\t\t.number()\n\t\t.max(2 ** 31 - 1)\n\t\t.optional(),\n\tfilename: z.string().max(1_024).optional(),\n\ttitle: z.string().max(1_024).optional(),\n\twaveform: z.string().max(400).optional(),\n});\n\nexport const allowedMentionPredicate = z\n\t.object({\n\t\tparse: z.enum(AllowedMentionsTypes).array().optional(),\n\t\troles: z.string().array().max(100).optional(),\n\t\tusers: z.string().array().max(100).optional(),\n\t\treplied_user: z.boolean().optional(),\n\t})\n\t.refine(\n\t\t(data) =>\n\t\t\t!(\n\t\t\t\t(data.parse?.includes(AllowedMentionsTypes.User) && data.users?.length) ||\n\t\t\t\t(data.parse?.includes(AllowedMentionsTypes.Role) && data.roles?.length)\n\t\t\t),\n\t\t{\n\t\t\terror:\n\t\t\t\t'Cannot specify both parse: [\"users\"] and non-empty users array, or parse: [\"roles\"] and non-empty roles array. These are mutually exclusive',\n\t\t},\n\t);\n\nexport const messageReferencePredicate = z.object({\n\tchannel_id: z.string().optional(),\n\tfail_if_not_exists: z.boolean().optional(),\n\tguild_id: z.string().optional(),\n\tmessage_id: z.string(),\n\ttype: z.enum(MessageReferenceType).optional(),\n});\n\nconst baseMessagePredicate = z.object({\n\tnonce: z.union([z.string().max(25), z.number()]).optional(),\n\ttts: z.boolean().optional(),\n\tallowed_mentions: allowedMentionPredicate.optional(),\n\tmessage_reference: messageReferencePredicate.optional(),\n\tattachments: attachmentPredicate.array().max(10).optional(),\n\tenforce_nonce: z.boolean().optional(),\n});\n\nconst basicActionRowPredicate = z.object({\n\ttype: z.literal(ComponentType.ActionRow),\n\tcomponents: z\n\t\t.object({\n\t\t\ttype: z.literal([\n\t\t\t\tComponentType.Button,\n\t\t\t\tComponentType.ChannelSelect,\n\t\t\t\tComponentType.MentionableSelect,\n\t\t\t\tComponentType.RoleSelect,\n\t\t\t\tComponentType.StringSelect,\n\t\t\t\tComponentType.UserSelect,\n\t\t\t]),\n\t\t})\n\t\t.array(),\n});\n\nconst messageNoComponentsV2Predicate = baseMessagePredicate\n\t.extend({\n\t\tcontent: z.string().max(2_000).optional(),\n\t\tembeds: embedPredicate.array().max(10).optional(),\n\t\tsticker_ids: z.array(z.string()).max(3).optional(),\n\t\tpoll: pollPredicate.optional(),\n\t\tcomponents: basicActionRowPredicate.array().max(5).optional(),\n\t\tflags: z\n\t\t\t.int()\n\t\t\t.optional()\n\t\t\t.refine((flags) => !flags || (flags & MessageFlags.IsComponentsV2) === 0, {\n\t\t\t\terror: 'Cannot set content, embeds, stickers, or poll with IsComponentsV2 flag set',\n\t\t\t}),\n\t})\n\t.refine(\n\t\t(data) =>\n\t\t\tdata.content !== undefined ||\n\t\t\t(data.embeds !== undefined && data.embeds.length > 0) ||\n\t\t\tdata.poll !== undefined ||\n\t\t\t(data.attachments !== undefined && data.attachments.length > 0) ||\n\t\t\t(data.components !== undefined && data.components.length > 0) ||\n\t\t\t(data.sticker_ids !== undefined && data.sticker_ids.length > 0),\n\t\t{ error: 'Messages must have content, embeds, a poll, attachments, components or stickers' },\n\t);\n\nconst allTopLevelComponentsPredicate = z\n\t.union([\n\t\tbasicActionRowPredicate,\n\t\tz.object({\n\t\t\ttype: z.literal([\n\t\t\t\t// Components v2\n\t\t\t\tComponentType.Container,\n\t\t\t\tComponentType.File,\n\t\t\t\tComponentType.MediaGallery,\n\t\t\t\tComponentType.Section,\n\t\t\t\tComponentType.Separator,\n\t\t\t\tComponentType.TextDisplay,\n\t\t\t\tComponentType.Thumbnail,\n\t\t\t]),\n\t\t}),\n\t])\n\t.array()\n\t.min(1)\n\t.max(10);\n\nconst messageComponentsV2Predicate = baseMessagePredicate.extend({\n\tcomponents: allTopLevelComponentsPredicate,\n\tflags: z.int().refine((flags) => (flags & MessageFlags.IsComponentsV2) === MessageFlags.IsComponentsV2, {\n\t\terror: 'Must set IsComponentsV2 flag to use Components V2',\n\t}),\n\t// These fields cannot be set\n\tcontent: z.string().length(0).nullish(),\n\tembeds: z.array(z.never()).nullish(),\n\tsticker_ids: z.array(z.never()).nullish(),\n\tpoll: z.null().optional(),\n});\n\nexport const messagePredicate = z.union([messageNoComponentsV2Predicate, messageComponentsV2Predicate]);\n\n// This validator does not assert file.key <-> attachment.id coherence. This is fine, because the builders\n// should effectively guarantee that.\nexport const fileBodyMessagePredicate = z.object({\n\tbody: messagePredicate,\n\t// No min length to support message edits\n\tfiles: rawFilePredicate.array().max(10),\n});\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { AllowedMentionsTypes, APIAllowedMentions, Snowflake } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../util/normalizeArray.js';\nimport { validate } from '../util/validation.js';\nimport { allowedMentionPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for allowed mentions.\n */\nexport class AllowedMentionsBuilder implements JSONEncodable<APIAllowedMentions> {\n\t/**\n\t * The API data associated with these allowed mentions.\n\t */\n\tprivate readonly data: Partial<APIAllowedMentions>;\n\n\t/**\n\t * Creates a new allowed mentions builder.\n\t *\n\t * @param data - The API data to create this allowed mentions with\n\t */\n\tpublic constructor(data: Partial<APIAllowedMentions> = {}) {\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * Sets the types of mentions to parse from the content.\n\t *\n\t * @param parse - The types of mentions to parse from the content\n\t */\n\tpublic setParse(...parse: RestOrArray<AllowedMentionsTypes>): this {\n\t\tthis.data.parse = normalizeArray(parse);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the parse mention types.\n\t */\n\tpublic clearParse(): this {\n\t\tthis.data.parse = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the roles to mention.\n\t *\n\t * @param roles - The roles to mention\n\t */\n\tpublic setRoles(...roles: RestOrArray<Snowflake>): this {\n\t\tthis.data.roles = normalizeArray(roles);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds roles to mention.\n\t *\n\t * @param roles - The roles to mention\n\t */\n\tpublic addRoles(...roles: RestOrArray<Snowflake>): this {\n\t\tthis.data.roles ??= [];\n\t\tthis.data.roles.push(...normalizeArray(roles));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts roles.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing roles.\n\t * @example\n\t * Remove the first role:\n\t * ```ts\n\t * allowedMentions.spliceRoles(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n roles:\n\t * ```ts\n\t * const n = 4;\n\t * allowedMentions.spliceRoles(0, n);\n\t * ```\n\t * @example\n\t * Remove the last role:\n\t * ```ts\n\t * allowedMentions.spliceRoles(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of roles to remove\n\t * @param roles - The replacing role ids\n\t */\n\tpublic spliceRoles(index: number, deleteCount: number, ...roles: RestOrArray<Snowflake>): this {\n\t\tthis.data.roles ??= [];\n\t\tthis.data.roles.splice(index, deleteCount, ...normalizeArray(roles));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the roles to mention.\n\t */\n\tpublic clearRoles(): this {\n\t\tthis.data.roles = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the users to mention.\n\t *\n\t * @param users - The users to mention\n\t */\n\tpublic setUsers(...users: RestOrArray<Snowflake>): this {\n\t\tthis.data.users = normalizeArray(users);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds users to mention.\n\t *\n\t * @param users - The users to mention\n\t */\n\tpublic addUsers(...users: RestOrArray<Snowflake>): this {\n\t\tthis.data.users ??= [];\n\t\tthis.data.users.push(...normalizeArray(users));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts users.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing users.\n\t * @example\n\t * Remove the first user:\n\t * ```ts\n\t * allowedMentions.spliceUsers(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n users:\n\t * ```ts\n\t * const n = 4;\n\t * allowedMentions.spliceUsers(0, n);\n\t * ```\n\t * @example\n\t * Remove the last user:\n\t * ```ts\n\t * allowedMentions.spliceUsers(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of users to remove\n\t * @param users - The replacing user ids\n\t */\n\tpublic spliceUsers(index: number, deleteCount: number, ...users: RestOrArray<Snowflake>): this {\n\t\tthis.data.users ??= [];\n\t\tthis.data.users.splice(index, deleteCount, ...normalizeArray(users));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the users to mention.\n\t */\n\tpublic clearUsers(): this {\n\t\tthis.data.users = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * For replies, sets whether to mention the author of the message being replied to.\n\t *\n\t * @param repliedUser - Whether to mention the author of the message being replied to\n\t */\n\tpublic setRepliedUser(repliedUser = true): this {\n\t\tthis.data.replied_user = repliedUser;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIAllowedMentions {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(allowedMentionPredicate, clone, validationOverride);\n\n\t\treturn clone as APIAllowedMentions;\n\t}\n}\n","import type { Buffer } from 'node:buffer';\nimport type { JSONEncodable, RawFile } from '@discordjs/util';\nimport type { RESTAPIAttachment, Snowflake } from 'discord-api-types/v10';\nimport { validate } from '../util/validation.js';\nimport { attachmentPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for attachments.\n */\nexport class AttachmentBuilder implements JSONEncodable<RESTAPIAttachment> {\n\t/**\n\t * The API data associated with this attachment.\n\t */\n\tprivate readonly data: Partial<RESTAPIAttachment>;\n\n\t/**\n\t * This data is not included in the output of `toJSON()`. For this class specifically, this refers to binary data\n\t * that will wind up being included in the multipart/form-data request, if used with the `MessageBuilder`.\n\t * To retrieve this data, use {@link getRawFile}.\n\t *\n\t * @remarks This cannot be set via the constructor, primarily because of the behavior described\n\t * {@link https://discord.com/developers/docs/reference#editing-message-attachments | here}.\n\t * That is, when editing a message's attachments, you should only be providing file data for new attachments.\n\t */\n\tprivate readonly fileData: Partial<Pick<RawFile, 'contentType' | 'data'>>;\n\n\t/**\n\t * Creates a new attachment builder.\n\t *\n\t * @param data - The API data to create this attachment with\n\t * @example\n\t * ```ts\n\t * const attachment = new AttachmentBuilder().setId(1).setFileData(':)').setFilename('smiley.txt')\n\t * ```\n\t * @remarks Please note that the `id` field is required, it's rather easy to miss!\n\t */\n\tpublic constructor(data: Partial<RESTAPIAttachment> = {}) {\n\t\tthis.data = structuredClone(data);\n\t\tthis.fileData = {};\n\t}\n\n\t/**\n\t * Sets the id of the attachment.\n\t *\n\t * @param id - The id of the attachment\n\t */\n\tpublic setId(id: Snowflake | number): this {\n\t\tthis.data.id = id;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this attachment.\n\t *\n\t * @param description - The description of the attachment\n\t */\n\tpublic setDescription(description: string): this {\n\t\tthis.data.description = description;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description of this attachment.\n\t */\n\tpublic clearDescription(): this {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the duration of this attachment (audio clips).\n\t *\n\t * @param duration - The duration of the attachment in seconds\n\t */\n\tpublic setDuration(duration: number): this {\n\t\tthis.data.duration_secs = duration;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the duration of this attachment.\n\t */\n\tpublic clearDuration(): this {\n\t\tthis.data.duration_secs = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the filename of this attachment.\n\t *\n\t * @param filename - The filename of the attachment\n\t */\n\tpublic setFilename(filename: string): this {\n\t\tthis.data.filename = filename;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the filename of this attachment.\n\t */\n\tpublic clearFilename(): this {\n\t\tthis.data.filename = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the file data to upload with this attachment.\n\t *\n\t * @param data - The file data\n\t * @remarks Note that this data is NOT included in the {@link toJSON} output. To retrieve it, use {@link getRawFile}.\n\t */\n\tpublic setFileData(data: Buffer | Uint8Array | string): this {\n\t\tthis.fileData.data = data;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the file data from this attachment.\n\t */\n\tpublic clearFileData(): this {\n\t\tthis.fileData.data = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the content type of the file data to upload with this attachment.\n\t *\n\t * @remarks Note that this data is NOT included in the {@link toJSON} output. To retrieve it, use {@link getRawFile}.\n\t */\n\tpublic setFileContentType(contentType: string): this {\n\t\tthis.fileData.contentType = contentType;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the content type of the file data from this attachment.\n\t */\n\tpublic clearFileContentType(): this {\n\t\tthis.fileData.contentType = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Converts this attachment to a {@link RawFile} for uploading.\n\t *\n\t * @returns A {@link RawFile} object, or `undefined` if no file data is set\n\t */\n\tpublic getRawFile(): Partial<RawFile> | undefined {\n\t\tif (!this.fileData?.data) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn {\n\t\t\t...this.fileData,\n\t\t\tname: this.data.filename,\n\t\t\tkey: this.data.id === undefined ? undefined : `files[${this.data.id}]`,\n\t\t};\n\t}\n\n\t/**\n\t * Sets the title of this attachment.\n\t *\n\t * @param title - The title of the attachment\n\t */\n\tpublic setTitle(title: string): this {\n\t\tthis.data.title = title;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the title of this attachment.\n\t */\n\tpublic clearTitle(): this {\n\t\tthis.data.title = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the waveform of this attachment (audio clips).\n\t *\n\t * @param waveform - The waveform of the attachment\n\t */\n\tpublic setWaveform(waveform: string): this {\n\t\tthis.data.waveform = waveform;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the waveform of this attachment.\n\t */\n\tpublic clearWaveform(): this {\n\t\tthis.data.waveform = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): RESTAPIAttachment {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(attachmentPredicate, clone, validationOverride);\n\n\t\treturn clone as RESTAPIAttachment;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { MessageReferenceType, RESTAPIMessageReference, Snowflake } from 'discord-api-types/v10';\nimport { validate } from '../util/validation.js';\nimport { messageReferencePredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for message references.\n */\nexport class MessageReferenceBuilder implements JSONEncodable<RESTAPIMessageReference> {\n\t/**\n\t * The API data associated with this message reference.\n\t */\n\tprivate readonly data: Partial<RESTAPIMessageReference>;\n\n\t/**\n\t * Creates a new message reference builder.\n\t *\n\t * @param data - The API data to create this message reference with\n\t */\n\tpublic constructor(data: Partial<RESTAPIMessageReference> = {}) {\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * Sets the type of message reference this represents\n\t *\n\t * @param type - The type of message reference\n\t */\n\tpublic setType(type: MessageReferenceType): this {\n\t\tthis.data.type = type;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clear the type of message reference this represents\n\t */\n\tpublic clearType(): this {\n\t\tthis.data.type = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the id of the message being referenced\n\t *\n\t * @param messageId - The id of the message being referenced\n\t */\n\tpublic setMessageId(messageId: Snowflake): this {\n\t\tthis.data.message_id = messageId;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the id of the channel being referenced\n\t *\n\t * @param channelId - The id of the channel being referenced\n\t */\n\tpublic setChannelId(channelId: Snowflake): this {\n\t\tthis.data.channel_id = channelId;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clear the id of the channel being referenced\n\t */\n\tpublic clearChannelId(): this {\n\t\tthis.data.channel_id = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the id of the guild being referenced\n\t *\n\t * @param guildId - The id of the guild being referenced\n\t */\n\tpublic setGuildId(guildId: Snowflake): this {\n\t\tthis.data.guild_id = guildId;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clear the id of the guild being referenced\n\t */\n\tpublic clearGuildId(): this {\n\t\tthis.data.guild_id = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether to fail the message creation if the referenced message does not exist\n\t *\n\t * @param failIfNotExists - Whether to fail the message creation if the referenced message does not exist\n\t */\n\tpublic setFailIfNotExists(failIfNotExists = true): this {\n\t\tthis.data.fail_if_not_exists = failIfNotExists;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): RESTAPIMessageReference {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(messageReferencePredicate, clone, validationOverride);\n\n\t\treturn clone as RESTAPIMessageReference;\n\t}\n}\n","import type { FileBodyEncodable, FileBodyEncodableResult, JSONEncodable, RawFile } from '@discordjs/util';\nimport type {\n\tAPIActionRowComponent,\n\tAPIAllowedMentions,\n\tAPIAttachment,\n\tAPIEmbed,\n\tAPIComponentInMessageActionRow,\n\tAPIMessageReference,\n\tAPIPoll,\n\tRESTPostAPIChannelMessageJSONBody,\n\tSnowflake,\n\tMessageFlags,\n\tAPIContainerComponent,\n\tAPIFileComponent,\n\tAPIMediaGalleryComponent,\n\tAPISectionComponent,\n\tAPISeparatorComponent,\n\tAPITextDisplayComponent,\n\tAPIMessageTopLevelComponent,\n} from 'discord-api-types/v10';\nimport { ActionRowBuilder } from '../components/ActionRow.js';\nimport { ComponentBuilder } from '../components/Component.js';\nimport type { MessageTopLevelComponentBuilder } from '../components/Components.js';\nimport { createComponentBuilder } from '../components/Components.js';\nimport { ContainerBuilder } from '../components/v2/Container.js';\nimport { FileBuilder } from '../components/v2/File.js';\nimport { MediaGalleryBuilder } from '../components/v2/MediaGallery.js';\nimport { SectionBuilder } from '../components/v2/Section.js';\nimport { SeparatorBuilder } from '../components/v2/Separator.js';\nimport { TextDisplayBuilder } from '../components/v2/TextDisplay.js';\nimport { normalizeArray, type RestOrArray } from '../util/normalizeArray.js';\nimport { resolveBuilder } from '../util/resolveBuilder.js';\nimport { validate } from '../util/validation.js';\nimport { AllowedMentionsBuilder } from './AllowedMentions.js';\nimport { fileBodyMessagePredicate, messagePredicate } from './Assertions.js';\nimport { AttachmentBuilder } from './Attachment.js';\nimport { MessageReferenceBuilder } from './MessageReference.js';\nimport { EmbedBuilder } from './embed/Embed.js';\nimport { PollBuilder } from './poll/Poll.js';\n\nexport interface MessageBuilderData extends Partial<\n\tOmit<\n\t\tRESTPostAPIChannelMessageJSONBody,\n\t\t'allowed_mentions' | 'attachments' | 'components' | 'embeds' | 'message_reference' | 'poll'\n\t>\n> {\n\tallowed_mentions?: AllowedMentionsBuilder;\n\tattachments: AttachmentBuilder[];\n\tcomponents: MessageTopLevelComponentBuilder[];\n\tembeds: EmbedBuilder[];\n\tmessage_reference?: MessageReferenceBuilder;\n\tpoll?: PollBuilder;\n}\n\n/**\n * A builder that creates API-compatible JSON data for messages.\n */\nexport class MessageBuilder\n\timplements JSONEncodable<RESTPostAPIChannelMessageJSONBody>, FileBodyEncodable<RESTPostAPIChannelMessageJSONBody>\n{\n\t/**\n\t * The API data associated with this message.\n\t */\n\tprivate readonly data: MessageBuilderData;\n\n\t/**\n\t * Gets the attachments of this message.\n\t */\n\tpublic get attachments(): readonly AttachmentBuilder[] {\n\t\treturn this.data.attachments;\n\t}\n\n\t/**\n\t * Gets the components of this message.\n\t */\n\tpublic get components(): readonly MessageTopLevelComponentBuilder[] {\n\t\treturn this.data.components;\n\t}\n\n\t/**\n\t * Gets the embeds of this message.\n\t */\n\tpublic get embeds(): readonly EmbedBuilder[] {\n\t\treturn this.data.embeds;\n\t}\n\n\t/**\n\t * Creates a new message builder.\n\t *\n\t * @param data - The API data to create this message with\n\t */\n\tpublic constructor(data: Partial<RESTPostAPIChannelMessageJSONBody> = {}) {\n\t\tconst { attachments = [], embeds = [], components = [], message_reference, poll, allowed_mentions, ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tallowed_mentions: allowed_mentions && new AllowedMentionsBuilder(allowed_mentions),\n\t\t\tattachments: attachments.map((attachment) => new AttachmentBuilder(attachment)),\n\t\t\tembeds: embeds.map((embed) => new EmbedBuilder(embed)),\n\t\t\tpoll: poll && new PollBuilder(poll),\n\t\t\tcomponents: components.map((component) => createComponentBuilder(component)),\n\t\t\tmessage_reference: message_reference && new MessageReferenceBuilder(message_reference),\n\t\t};\n\t}\n\n\t/**\n\t * Sets the content of the message.\n\t *\n\t * @param content - The content to set\n\t */\n\tpublic setContent(content: string): this {\n\t\tthis.data.content = content;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the content of the message.\n\t */\n\tpublic clearContent(): this {\n\t\tthis.data.content = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the nonce of the message.\n\t *\n\t * @param nonce - The nonce to set\n\t */\n\tpublic setNonce(nonce: number | string): this {\n\t\tthis.data.nonce = nonce;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the nonce of the message.\n\t */\n\tpublic clearNonce(): this {\n\t\tthis.data.nonce = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether the message is TTS.\n\t *\n\t * @param tts - Whether the message is TTS\n\t */\n\tpublic setTTS(tts = true): this {\n\t\tthis.data.tts = tts;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Appends embeds to this message.\n\t *\n\t * @remarks\n\t * The maximum amount of embeds that can be added is 10.\n\t * @example\n\t * Using an array:\n\t * ```ts\n\t * const embeds: APIEmbed[] = ...;\n\t * const message = new MessageBuilder()\n\t * \t.addEmbeds(embeds);\n\t * ```\n\t * @example\n\t * Using rest parameters (variadic):\n\t * ```ts\n\t * const message = new MessageBuilder()\n\t * \t.addEmbeds(\n\t * \t\t{ title: 'Embed 1' },\n\t * \t\t{ title: 'Embed 2' },\n\t * \t);\n\t * ```\n\t * @param embeds - The embeds to add\n\t */\n\tpublic addEmbeds(...embeds: RestOrArray<APIEmbed | EmbedBuilder | ((builder: EmbedBuilder) => EmbedBuilder)>): this {\n\t\tthis.data.embeds ??= [];\n\n\t\tconst resolved = normalizeArray(embeds).map((embed) => resolveBuilder(embed, EmbedBuilder));\n\t\tthis.data.embeds.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts embeds for this message.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing embeds of a message.\n\t * @example\n\t * Remove the first embed:\n\t * ```ts\n\t * message.spliceEmbeds(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n embeds:\n\t * ```ts\n\t * const n = 4;\n\t * message.spliceEmbeds(0, n);\n\t * ```\n\t * @example\n\t * Remove the last embed:\n\t * ```ts\n\t * message.spliceEmbeds(-1, 1);\n\t * ```\n\t * @param start - The index to start at\n\t * @param deleteCount - The amount of embeds to remove\n\t * @param embeds - The embeds to insert\n\t */\n\tpublic spliceEmbeds(\n\t\tstart: number,\n\t\tdeleteCount: number,\n\t\t...embeds: RestOrArray<APIEmbed | EmbedBuilder | ((builder: EmbedBuilder) => EmbedBuilder)>\n\t): this {\n\t\tthis.data.embeds ??= [];\n\t\tconst resolved = normalizeArray(embeds).map((embed) => resolveBuilder(embed, EmbedBuilder));\n\n\t\tthis.data.embeds.splice(start, deleteCount, ...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the embeds for this message.\n\t *\n\t * @param embeds - The embeds to set\n\t */\n\tpublic setEmbeds(...embeds: RestOrArray<APIEmbed | EmbedBuilder | ((builder: EmbedBuilder) => EmbedBuilder)>): this {\n\t\treturn this.spliceEmbeds(0, this.embeds.length, ...normalizeArray(embeds));\n\t}\n\n\t/**\n\t * Sets the allowed mentions for this message.\n\t *\n\t * @param allowedMentions - The allowed mentions to set\n\t */\n\tpublic setAllowedMentions(\n\t\tallowedMentions:\n\t\t\t| AllowedMentionsBuilder\n\t\t\t| APIAllowedMentions\n\t\t\t| ((builder: AllowedMentionsBuilder) => AllowedMentionsBuilder) = new AllowedMentionsBuilder(),\n\t): this {\n\t\tthis.data.allowed_mentions = resolveBuilder(allowedMentions, AllowedMentionsBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the allowed mentions for this message (and creates it if it doesn't exist)\n\t *\n\t * @param updater - The function to update the allowed mentions with\n\t */\n\tpublic updateAllowedMentions(updater: (builder: AllowedMentionsBuilder) => void): this {\n\t\tupdater((this.data.allowed_mentions ??= new AllowedMentionsBuilder()));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the allowed mentions for this message.\n\t */\n\tpublic clearAllowedMentions(): this {\n\t\tthis.data.allowed_mentions = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the message reference for this message.\n\t *\n\t * @param reference - The reference to set\n\t */\n\tpublic setMessageReference(\n\t\treference:\n\t\t\t| APIMessageReference\n\t\t\t| MessageReferenceBuilder\n\t\t\t| ((builder: MessageReferenceBuilder) => MessageReferenceBuilder),\n\t): this {\n\t\tthis.data.message_reference = resolveBuilder(reference, MessageReferenceBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the message reference for this message (and creates it if it doesn't exist)\n\t *\n\t * @param updater - The function to update the message reference with\n\t */\n\tpublic updateMessageReference(updater: (builder: MessageReferenceBuilder) => void): this {\n\t\tupdater((this.data.message_reference ??= new MessageReferenceBuilder()));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the message reference for this message.\n\t */\n\tpublic clearMessageReference(): this {\n\t\tthis.data.message_reference = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds action row components to this message.\n\t *\n\t * @param components - The action row components to add\n\t */\n\tpublic addActionRowComponents(\n\t\t...components: RestOrArray<\n\t\t\t| ActionRowBuilder\n\t\t\t| APIActionRowComponent<APIComponentInMessageActionRow>\n\t\t\t| ((builder: ActionRowBuilder) => ActionRowBuilder)\n\t\t>\n\t): this {\n\t\tthis.data.components ??= [];\n\n\t\tconst resolved = normalizeArray(components).map((component) => resolveBuilder(component, ActionRowBuilder));\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds container components to this message.\n\t *\n\t * @param components - The container components to add\n\t */\n\tpublic addContainerComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPIContainerComponent | ContainerBuilder | ((builder: ContainerBuilder) => ContainerBuilder)\n\t\t>\n\t): this {\n\t\tthis.data.components ??= [];\n\n\t\tconst resolved = normalizeArray(components).map((component) => resolveBuilder(component, ContainerBuilder));\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds file components to this message.\n\t *\n\t * @param components - The file components to add\n\t */\n\tpublic addFileComponents(\n\t\t...components: RestOrArray<APIFileComponent | FileBuilder | ((builder: FileBuilder) => FileBuilder)>\n\t): this {\n\t\tthis.data.components ??= [];\n\n\t\tconst resolved = normalizeArray(components).map((component) => resolveBuilder(component, FileBuilder));\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds media gallery components to this message.\n\t *\n\t * @param components - The media gallery components to add\n\t */\n\tpublic addMediaGalleryComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPIMediaGalleryComponent | MediaGalleryBuilder | ((builder: MediaGalleryBuilder) => MediaGalleryBuilder)\n\t\t>\n\t): this {\n\t\tthis.data.components ??= [];\n\n\t\tconst resolved = normalizeArray(components).map((component) => resolveBuilder(component, MediaGalleryBuilder));\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds section components to this message.\n\t *\n\t * @param components - The section components to add\n\t */\n\tpublic addSectionComponents(\n\t\t...components: RestOrArray<APISectionComponent | SectionBuilder | ((builder: SectionBuilder) => SectionBuilder)>\n\t): this {\n\t\tthis.data.components ??= [];\n\n\t\tconst resolved = normalizeArray(components).map((component) => resolveBuilder(component, SectionBuilder));\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds separator components to this message.\n\t *\n\t * @param components - The separator components to add\n\t */\n\tpublic addSeparatorComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPISeparatorComponent | SeparatorBuilder | ((builder: SeparatorBuilder) => SeparatorBuilder)\n\t\t>\n\t): this {\n\t\tthis.data.components ??= [];\n\n\t\tconst resolved = normalizeArray(components).map((component) => resolveBuilder(component, SeparatorBuilder));\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds text display components to this message.\n\t *\n\t * @param components - The text display components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t): this {\n\t\tthis.data.components ??= [];\n\n\t\tconst resolved = normalizeArray(components).map((component) => resolveBuilder(component, TextDisplayBuilder));\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts components for this message.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing components of a message.\n\t * @example\n\t * Remove the first component:\n\t * ```ts\n\t * message.spliceComponents(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n components:\n\t * ```ts\n\t * const n = 4;\n\t * message.spliceComponents(0, n);\n\t * ```\n\t * @example\n\t * Remove the last component:\n\t * ```ts\n\t * message.spliceComponents(-1, 1);\n\t * ```\n\t * @param start - The index to start at\n\t * @param deleteCount - The amount of components to remove\n\t * @param components - The components to insert\n\t */\n\tpublic spliceComponents(\n\t\tstart: number,\n\t\tdeleteCount: number,\n\t\t...components: RestOrArray<APIMessageTopLevelComponent | MessageTopLevelComponentBuilder>\n\t): this {\n\t\tthis.data.components ??= [];\n\t\tconst resolved = normalizeArray(components).map((component) =>\n\t\t\tcomponent instanceof ComponentBuilder ? component : createComponentBuilder(component),\n\t\t);\n\n\t\tthis.data.components.splice(start, deleteCount, ...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the sticker ids of this message.\n\t *\n\t * @param stickerIds - The ids of the stickers to set\n\t */\n\tpublic setStickerIds(...stickerIds: RestOrArray<Snowflake>): this {\n\t\treturn this.spliceStickerIds(0, this.data.sticker_ids?.length ?? 0, ...normalizeArray(stickerIds));\n\t}\n\n\t/**\n\t * Adds sticker ids to this message.\n\t *\n\t * @param stickerIds - The ids of the stickers to add\n\t */\n\tpublic addStickerIds(...stickerIds: RestOrArray<Snowflake>): this {\n\t\tthis.data.sticker_ids ??= [] as unknown as MessageBuilderData['sticker_ids'];\n\t\tthis.data.sticker_ids!.push(...normalizeArray(stickerIds));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts sticker ids for this message.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing sticker ids of a message.\n\t * @example\n\t * Remove the first sticker id:\n\t * ```ts\n\t * message.spliceStickerIds(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n sticker ids:\n\t * ```ts\n\t * const n = 4;\n\t * message.spliceStickerIds(0, n);\n\t * ```\n\t * @example\n\t * Remove the last sticker id:\n\t * ```ts\n\t * message.spliceStickerIds(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The amount of sticker ids to remove\n\t * @param stickerIds - The sticker ids to insert\n\t */\n\tpublic spliceStickerIds(index: number, deleteCount: number, ...stickerIds: RestOrArray<Snowflake>): this {\n\t\tthis.data.sticker_ids ??= [] as unknown as MessageBuilderData['sticker_ids'];\n\t\tthis.data.sticker_ids!.splice(index, deleteCount, ...normalizeArray(stickerIds));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets attachments for this message.\n\t *\n\t * @param attachments - The attachments to set\n\t */\n\tpublic setAttachments(\n\t\t...attachments: RestOrArray<APIAttachment | AttachmentBuilder | ((builder: AttachmentBuilder) => AttachmentBuilder)>\n\t): this {\n\t\treturn this.spliceAttachments(0, this.data.attachments.length, ...normalizeArray(attachments));\n\t}\n\n\t/**\n\t * Adds attachments to this message.\n\t *\n\t * @param attachments - The attachments to add\n\t */\n\tpublic addAttachments(\n\t\t...attachments: RestOrArray<APIAttachment | AttachmentBuilder | ((builder: AttachmentBuilder) => AttachmentBuilder)>\n\t): this {\n\t\tconst resolved = normalizeArray(attachments).map((attachment) => resolveBuilder(attachment, AttachmentBuilder));\n\t\tthis.data.attachments.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts attachments for this message.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing attachments of a message.\n\t * @example\n\t * Remove the first attachment:\n\t * ```ts\n\t * message.spliceAttachments(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n attachments:\n\t * ```ts\n\t * const n = 4;\n\t * message.spliceAttachments(0, n);\n\t * ```\n\t * @example\n\t * Remove the last attachment:\n\t * ```ts\n\t * message.spliceAttachments(-1, 1);\n\t * ```\n\t * @param start - The index to start at\n\t * @param deleteCount - The amount of attachments to remove\n\t * @param attachments - The attachments to insert\n\t */\n\tpublic spliceAttachments(\n\t\tstart: number,\n\t\tdeleteCount: number,\n\t\t...attachments: RestOrArray<APIAttachment | AttachmentBuilder | ((builder: AttachmentBuilder) => AttachmentBuilder)>\n\t): this {\n\t\tconst resolved = normalizeArray(attachments).map((attachment) => resolveBuilder(attachment, AttachmentBuilder));\n\t\tthis.data.attachments.splice(start, deleteCount, ...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the flags for this message.\n\t *\n\t * @param flags - The flags to set\n\t */\n\tpublic setFlags(flags: MessageFlags): this {\n\t\tthis.data.flags = flags;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the flags for this message.\n\t */\n\tpublic clearFlags(): this {\n\t\tthis.data.flags = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether to enforce recent uniqueness of the nonce of this message.\n\t *\n\t * @param enforceNonce - Whether to enforce recent uniqueness of the nonce of this message\n\t */\n\tpublic setEnforceNonce(enforceNonce = true): this {\n\t\tthis.data.enforce_nonce = enforceNonce;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the poll for this message.\n\t *\n\t * @param poll - The poll to set\n\t */\n\tpublic setPoll(poll: APIPoll | PollBuilder | ((builder: PollBuilder) => PollBuilder)): this {\n\t\tthis.data.poll = resolveBuilder(poll, PollBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the poll for this message (and creates it if it doesn't exist)\n\t *\n\t * @param updater - The function to update the poll with\n\t */\n\tpublic updatePoll(updater: (builder: PollBuilder) => void): this {\n\t\tupdater((this.data.poll ??= new PollBuilder()));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the poll for this message.\n\t */\n\tpublic clearPoll(): this {\n\t\tthis.data.poll = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): RESTPostAPIChannelMessageJSONBody {\n\t\tconst { poll, allowed_mentions, attachments, embeds, components, message_reference, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\t// Wherever we pass false, it's covered by the messagePredicate already\n\t\t\tpoll: poll?.toJSON(false),\n\t\t\tallowed_mentions: allowed_mentions?.toJSON(false),\n\t\t\tattachments: attachments.map((attachment) => attachment.toJSON(false)),\n\t\t\tembeds: embeds.map((embed) => embed.toJSON(false)),\n\t\t\t// Here, the messagePredicate does specific constraints rather than using the componentPredicate\n\t\t\tcomponents: components.map((component) => component.toJSON(validationOverride)),\n\t\t\tmessage_reference: message_reference?.toJSON(false),\n\t\t};\n\n\t\tvalidate(messagePredicate, data, validationOverride);\n\n\t\treturn data as RESTPostAPIChannelMessageJSONBody;\n\t}\n\n\t/**\n\t * Serializes this builder to both JSON body and file data for multipart/form-data requests.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t * @remarks\n\t * This method extracts file data from attachments that have files set via {@link AttachmentBuilder.setFileData}.\n\t * The returned body includes attachment metadata, while files contains the binary data for upload.\n\t */\n\tpublic toFileBody(validationOverride?: boolean): FileBodyEncodableResult<RESTPostAPIChannelMessageJSONBody> {\n\t\tconst body = this.toJSON(false);\n\n\t\tconst files: RawFile[] = [];\n\t\tfor (const attachment of this.data.attachments) {\n\t\t\tconst rawFile = attachment.getRawFile();\n\t\t\t// Only if data or content type are set, since that implies the intent is to send a new file.\n\t\t\t// In case it's contentType but not data, a validation error will be thrown right after.\n\t\t\tif (rawFile?.data || rawFile?.contentType) {\n\t\t\t\tfiles.push(rawFile as RawFile);\n\t\t\t}\n\t\t}\n\n\t\tconst combined = { body, files };\n\t\tvalidate(fileBodyMessagePredicate, combined, validationOverride);\n\n\t\treturn combined as FileBodyEncodableResult<RESTPostAPIChannelMessageJSONBody>;\n\t}\n}\n"],"mappings":"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","names":["import_v10","import_zod","import_zod","import_v10","import_v10","import_ts_mixer","import_v10","import_v10","import_v10","import_zod","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_zod","import_v10","import_v10","import_zod","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_zod","import_v10","import_v10","import_v10","import_zod","import_v10","import_v10","import_ts_mixer","import_v10","import_ts_mixer","import_v10","import_v10","import_ts_mixer","import_v10","import_v10","import_ts_mixer","import_v10","import_v10","import_ts_mixer","import_v10","import_ts_mixer","import_v10","import_zod","namePredicate","import_ts_mixer","import_v10","import_v10","import_v10","import_zod","import_zod","namePredicate","import_v10","import_zod","import_v10","import_zod"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/button/mixins/EmojiOrLabelButtonMixin.ts","../src/util/ValidationError.ts","../src/util/validation.ts","../src/components/Assertions.ts","../src/Assertions.ts","../src/components/Component.ts","../src/components/button/Button.ts","../src/components/button/CustomIdButton.ts","../src/components/button/LinkButton.ts","../src/components/button/PremiumButton.ts","../src/components/fileUpload/FileUpload.ts","../src/components/fileUpload/Assertions.ts","../src/components/label/Label.ts","../src/util/resolveBuilder.ts","../src/components/Components.ts","../src/components/ActionRow.ts","../src/util/normalizeArray.ts","../src/components/selectMenu/ChannelSelectMenu.ts","../src/components/selectMenu/BaseSelectMenu.ts","../src/components/selectMenu/MentionableSelectMenu.ts","../src/components/selectMenu/RoleSelectMenu.ts","../src/components/selectMenu/StringSelectMenu.ts","../src/components/selectMenu/StringSelectMenuOption.ts","../src/components/selectMenu/UserSelectMenu.ts","../src/components/textInput/TextInput.ts","../src/components/textInput/Assertions.ts","../src/components/v2/Container.ts","../src/components/v2/Assertions.ts","../src/components/v2/File.ts","../src/components/v2/MediaGallery.ts","../src/components/v2/MediaGalleryItem.ts","../src/components/v2/Section.ts","../src/components/v2/TextDisplay.ts","../src/components/v2/Thumbnail.ts","../src/components/v2/Separator.ts","../src/components/label/Assertions.ts","../src/interactions/commands/chatInput/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.ts","../src/interactions/commands/chatInput/mixins/ApplicationCommandOptionChannelTypesMixin.ts","../src/interactions/commands/chatInput/mixins/ApplicationCommandOptionWithAutocompleteMixin.ts","../src/interactions/commands/chatInput/mixins/ApplicationCommandOptionWithChoicesMixin.ts","../src/interactions/commands/chatInput/options/attachment.ts","../src/interactions/commands/SharedName.ts","../src/interactions/commands/SharedNameAndDescription.ts","../src/interactions/commands/chatInput/Assertions.ts","../src/interactions/commands/chatInput/options/ApplicationCommandOptionBase.ts","../src/interactions/commands/chatInput/options/boolean.ts","../src/interactions/commands/chatInput/options/channel.ts","../src/interactions/commands/chatInput/options/integer.ts","../src/interactions/commands/chatInput/options/mentionable.ts","../src/interactions/commands/chatInput/options/number.ts","../src/interactions/commands/chatInput/options/role.ts","../src/interactions/commands/chatInput/options/string.ts","../src/interactions/commands/chatInput/options/user.ts","../src/interactions/commands/chatInput/mixins/SharedChatInputCommandOptions.ts","../src/interactions/commands/chatInput/ChatInputCommandSubcommands.ts","../src/interactions/commands/chatInput/mixins/SharedSubcommands.ts","../src/interactions/commands/chatInput/ChatInputCommand.ts","../src/interactions/commands/Command.ts","../src/interactions/commands/contextMenu/Assertions.ts","../src/interactions/commands/contextMenu/ContextMenuCommand.ts","../src/interactions/commands/contextMenu/MessageCommand.ts","../src/interactions/commands/contextMenu/UserCommand.ts","../src/interactions/modals/Assertions.ts","../src/interactions/modals/Modal.ts","../src/messages/embed/Assertions.ts","../src/messages/embed/EmbedAuthor.ts","../src/messages/embed/EmbedField.ts","../src/messages/embed/EmbedFooter.ts","../src/messages/embed/Embed.ts","../src/messages/poll/Assertions.ts","../src/messages/poll/PollMedia.ts","../src/messages/poll/PollAnswerMedia.ts","../src/messages/poll/PollAnswer.ts","../src/messages/poll/PollQuestion.ts","../src/messages/poll/Poll.ts","../src/messages/Assertions.ts","../src/messages/AllowedMentions.ts","../src/messages/Attachment.ts","../src/messages/MessageReference.ts","../src/messages/Message.ts"],"sourcesContent":["export * from './components/button/mixins/EmojiOrLabelButtonMixin.js';\nexport * from './components/button/Button.js';\nexport * from './components/button/CustomIdButton.js';\nexport * from './components/button/LinkButton.js';\nexport * from './components/button/PremiumButton.js';\n\nexport * from './components/fileUpload/FileUpload.js';\nexport * from './components/fileUpload/Assertions.js';\n\nexport * from './components/label/Label.js';\nexport * from './components/label/Assertions.js';\n\nexport * from './components/selectMenu/BaseSelectMenu.js';\nexport * from './components/selectMenu/ChannelSelectMenu.js';\nexport * from './components/selectMenu/MentionableSelectMenu.js';\nexport * from './components/selectMenu/RoleSelectMenu.js';\nexport * from './components/selectMenu/StringSelectMenu.js';\nexport * from './components/selectMenu/StringSelectMenuOption.js';\nexport * from './components/selectMenu/UserSelectMenu.js';\n\nexport * from './components/textInput/TextInput.js';\nexport * from './components/textInput/Assertions.js';\n\nexport * from './components/ActionRow.js';\nexport * from './components/Assertions.js';\nexport * from './components/Component.js';\nexport * from './components/Components.js';\n\nexport * from './components/v2/Assertions.js';\nexport * from './components/v2/Container.js';\nexport * from './components/v2/File.js';\nexport * from './components/v2/MediaGallery.js';\nexport * from './components/v2/MediaGalleryItem.js';\nexport * from './components/v2/Section.js';\nexport * from './components/v2/Separator.js';\nexport * from './components/v2/TextDisplay.js';\nexport * from './components/v2/Thumbnail.js';\n\nexport * from './interactions/commands/chatInput/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nexport * from './interactions/commands/chatInput/mixins/ApplicationCommandOptionChannelTypesMixin.js';\nexport * from './interactions/commands/chatInput/mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nexport * from './interactions/commands/chatInput/mixins/ApplicationCommandOptionWithChoicesMixin.js';\nexport * from './interactions/commands/chatInput/mixins/SharedChatInputCommandOptions.js';\nexport * from './interactions/commands/chatInput/mixins/SharedSubcommands.js';\n\nexport * from './interactions/commands/chatInput/options/ApplicationCommandOptionBase.js';\nexport * from './interactions/commands/chatInput/options/boolean.js';\nexport * from './interactions/commands/chatInput/options/channel.js';\nexport * from './interactions/commands/chatInput/options/integer.js';\nexport * from './interactions/commands/chatInput/options/mentionable.js';\nexport * from './interactions/commands/chatInput/options/number.js';\nexport * from './interactions/commands/chatInput/options/role.js';\nexport * from './interactions/commands/chatInput/options/attachment.js';\nexport * from './interactions/commands/chatInput/options/string.js';\nexport * from './interactions/commands/chatInput/options/user.js';\n\nexport * from './interactions/commands/chatInput/Assertions.js';\nexport * from './interactions/commands/chatInput/ChatInputCommand.js';\nexport * from './interactions/commands/chatInput/ChatInputCommandSubcommands.js';\n\nexport * from './interactions/commands/contextMenu/Assertions.js';\nexport * from './interactions/commands/contextMenu/ContextMenuCommand.js';\nexport * from './interactions/commands/contextMenu/MessageCommand.js';\nexport * from './interactions/commands/contextMenu/UserCommand.js';\n\nexport * from './interactions/commands/Command.js';\nexport * from './interactions/commands/SharedName.js';\nexport * from './interactions/commands/SharedNameAndDescription.js';\n\nexport * from './interactions/modals/Assertions.js';\nexport * from './interactions/modals/Modal.js';\n\nexport * from './messages/embed/Assertions.js';\nexport * from './messages/embed/Embed.js';\nexport * from './messages/embed/EmbedAuthor.js';\nexport * from './messages/embed/EmbedField.js';\nexport * from './messages/embed/EmbedFooter.js';\n\nexport * from './messages/poll/Assertions.js';\nexport * from './messages/poll/Poll.js';\nexport * from './messages/poll/PollAnswer.js';\nexport * from './messages/poll/PollAnswerMedia.js';\nexport * from './messages/poll/PollMedia.js';\nexport * from './messages/poll/PollQuestion.js';\n\nexport * from './messages/AllowedMentions.js';\nexport * from './messages/Assertions.js';\nexport * from './messages/Attachment.js';\nexport * from './messages/Message.js';\nexport * from './messages/MessageReference.js';\n\nexport * from './util/normalizeArray.js';\nexport * from './util/resolveBuilder.js';\nexport { disableValidators, enableValidators, isValidationEnabled } from './util/validation.js';\nexport * from './util/ValidationError.js';\n\nexport * from './Assertions.js';\n\n// We expose this type in our public API. We shouldn't assume every user of builders is also using REST\nexport type { RawFile } from '@discordjs/util';\n\n/**\n * The {@link https://github.com/discordjs/discord.js/blob/main/packages/builders#readme | @discordjs/builders} version\n * that you are currently using.\n *\n * @privateRemarks This needs to explicitly be `string` so it is not typed as a \"const string\" that gets injected by esbuild.\n */\nexport const version = '2.0.0-dev.1766552010-7884ecd3a' as string;\n","import type { APIButtonComponent, APIButtonComponentWithSKUId, APIMessageComponentEmoji } from 'discord-api-types/v10';\n\nexport interface EmojiOrLabelButtonData extends Pick<\n\tExclude<APIButtonComponent, APIButtonComponentWithSKUId>,\n\t'emoji' | 'label'\n> {}\n\n/**\n * A mixin that adds emoji and label symbols to a button builder.\n */\nexport class EmojiOrLabelButtonMixin {\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: EmojiOrLabelButtonData;\n\n\t/**\n\t * Sets the emoji to display on this button.\n\t *\n\t * @param emoji - The emoji to use\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\tthis.data.emoji = emoji;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the emoji on this button.\n\t */\n\tpublic clearEmoji() {\n\t\tthis.data.emoji = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the label for this button.\n\t *\n\t * @param label - The label to use\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = label;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the label on this button.\n\t */\n\tpublic clearLabel() {\n\t\tthis.data.label = undefined;\n\t\treturn this;\n\t}\n}\n","import { z } from 'zod';\n\n/**\n * An error that is thrown when validation fails.\n */\nexport class ValidationError extends Error {\n\t/**\n\t * The underlying cause of the validation error.\n\t */\n\tpublic override readonly cause: z.ZodError;\n\n\t/**\n\t * @internal\n\t */\n\tpublic constructor(error: z.ZodError) {\n\t\tsuper(z.prettifyError(error));\n\n\t\tthis.name = 'ValidationError';\n\t\tthis.cause = error;\n\t}\n}\n","import type { z } from 'zod';\nimport { ValidationError } from './ValidationError.js';\n\nlet validationEnabled = true;\n\n/**\n * Enables validators.\n *\n * @returns Whether validation is occurring.\n */\nexport function enableValidators() {\n\treturn (validationEnabled = true);\n}\n\n/**\n * Disables validators.\n *\n * @returns Whether validation is occurring.\n */\nexport function disableValidators() {\n\treturn (validationEnabled = false);\n}\n\n/**\n * Checks whether validation is occurring.\n */\nexport function isValidationEnabled() {\n\treturn validationEnabled;\n}\n\n/**\n * Parses a value with a given validator, accounting for whether validation is enabled.\n *\n * @param validator - The zod validator to use\n * @param value - The value to parse\n * @param validationOverride - Force validation to run/not run regardless of your global preference\n * @returns The result from parsing\n * @throws {@link ValidationError}\n * Throws if the value does not pass validation, if enabled.\n * @internal\n */\nexport function validate<Validator extends z.ZodType>(\n\tvalidator: Validator,\n\tvalue: unknown,\n\tvalidationOverride?: boolean,\n): z.output<Validator> {\n\tif (validationOverride === false || (validationOverride === undefined && !isValidationEnabled())) {\n\t\treturn value as z.output<Validator>;\n\t}\n\n\tconst result = validator.safeParse(value);\n\n\tif (!result.success) {\n\t\tthrow new ValidationError(result.error);\n\t}\n\n\treturn result.data;\n}\n","import { ButtonStyle, ChannelType, ComponentType, SelectMenuDefaultValueType } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { idPredicate, customIdPredicate, snowflakePredicate } from '../Assertions.js';\n\nexport const emojiPredicate = z\n\t.strictObject({\n\t\tid: snowflakePredicate.optional(),\n\t\tname: z.string().min(1).max(32).optional(),\n\t\tanimated: z.boolean().optional(),\n\t})\n\t.refine((data) => data.id !== undefined || data.name !== undefined, {\n\t\terror: \"Either 'id' or 'name' must be provided\",\n\t});\n\nconst buttonPredicateBase = z.strictObject({\n\ttype: z.literal(ComponentType.Button),\n\tdisabled: z.boolean().optional(),\n});\n\nconst buttonLabelPredicate = z.string().min(1).max(80);\n\nconst buttonCustomIdPredicateBase = buttonPredicateBase\n\t.extend({\n\t\tcustom_id: customIdPredicate,\n\t\temoji: emojiPredicate.optional(),\n\t\tlabel: buttonLabelPredicate.optional(),\n\t})\n\t.refine((data) => data.emoji !== undefined || data.label !== undefined, {\n\t\tmessage: 'Buttons with a custom id must have either an emoji or a label.',\n\t});\n\nconst buttonPrimaryPredicate = buttonCustomIdPredicateBase.safeExtend({ style: z.literal(ButtonStyle.Primary) });\nconst buttonSecondaryPredicate = buttonCustomIdPredicateBase.safeExtend({ style: z.literal(ButtonStyle.Secondary) });\nconst buttonSuccessPredicate = buttonCustomIdPredicateBase.safeExtend({ style: z.literal(ButtonStyle.Success) });\nconst buttonDangerPredicate = buttonCustomIdPredicateBase.safeExtend({ style: z.literal(ButtonStyle.Danger) });\n\nconst buttonLinkPredicate = buttonPredicateBase\n\t.extend({\n\t\tstyle: z.literal(ButtonStyle.Link),\n\t\turl: z.url({ protocol: /^(?:https?|discord)$/ }).max(512),\n\t\temoji: emojiPredicate.optional(),\n\t\tlabel: buttonLabelPredicate.optional(),\n\t})\n\t.refine((data) => data.emoji !== undefined || data.label !== undefined, {\n\t\tmessage: 'Link buttons must have either an emoji or a label.',\n\t});\n\nconst buttonPremiumPredicate = buttonPredicateBase.extend({\n\tstyle: z.literal(ButtonStyle.Premium),\n\tsku_id: snowflakePredicate,\n});\n\nexport const buttonPredicate = z.discriminatedUnion('style', [\n\tbuttonLinkPredicate,\n\tbuttonPrimaryPredicate,\n\tbuttonSecondaryPredicate,\n\tbuttonSuccessPredicate,\n\tbuttonDangerPredicate,\n\tbuttonPremiumPredicate,\n]);\n\nconst selectMenuBasePredicate = z.object({\n\tid: idPredicate,\n\tplaceholder: z.string().max(150).optional(),\n\tmin_values: z.number().min(0).max(25).optional(),\n\tmax_values: z.number().min(0).max(25).optional(),\n\tcustom_id: customIdPredicate,\n\tdisabled: z.boolean().optional(),\n});\n\nexport const selectMenuChannelPredicate = selectMenuBasePredicate.extend({\n\ttype: z.literal(ComponentType.ChannelSelect),\n\tchannel_types: z.enum(ChannelType).array().optional(),\n\tdefault_values: z\n\t\t.object({ id: snowflakePredicate, type: z.literal(SelectMenuDefaultValueType.Channel) })\n\t\t.array()\n\t\t.max(25)\n\t\t.optional(),\n});\n\nexport const selectMenuMentionablePredicate = selectMenuBasePredicate.extend({\n\ttype: z.literal(ComponentType.MentionableSelect),\n\tdefault_values: z\n\t\t.object({\n\t\t\tid: snowflakePredicate,\n\t\t\ttype: z.literal([SelectMenuDefaultValueType.Role, SelectMenuDefaultValueType.User]),\n\t\t})\n\t\t.array()\n\t\t.max(25)\n\t\t.optional(),\n});\n\nexport const selectMenuRolePredicate = selectMenuBasePredicate.extend({\n\ttype: z.literal(ComponentType.RoleSelect),\n\tdefault_values: z\n\t\t.object({ id: snowflakePredicate, type: z.literal(SelectMenuDefaultValueType.Role) })\n\t\t.array()\n\t\t.max(25)\n\t\t.optional(),\n});\n\nexport const selectMenuStringOptionPredicate = z.object({\n\tlabel: z.string().min(1).max(100),\n\tvalue: z.string().min(1).max(100),\n\tdescription: z.string().min(1).max(100).optional(),\n\temoji: emojiPredicate.optional(),\n\tdefault: z.boolean().optional(),\n});\n\nexport const selectMenuStringPredicate = selectMenuBasePredicate\n\t.extend({\n\t\ttype: z.literal(ComponentType.StringSelect),\n\t\toptions: selectMenuStringOptionPredicate.array().min(1).max(25),\n\t})\n\t.check((ctx) => {\n\t\tconst addIssue = (name: string, minimum: number) =>\n\t\t\tctx.issues.push({\n\t\t\t\tcode: 'too_small',\n\t\t\t\tmessage: `The number of options must be greater than or equal to ${name}`,\n\t\t\t\tinclusive: true,\n\t\t\t\tminimum,\n\t\t\t\ttype: 'number',\n\t\t\t\tpath: ['options'],\n\t\t\t\torigin: 'number',\n\t\t\t\tinput: minimum,\n\t\t\t});\n\n\t\tif (ctx.value.min_values !== undefined && ctx.value.options.length < ctx.value.min_values) {\n\t\t\taddIssue('min_values', ctx.value.min_values);\n\t\t}\n\n\t\tif (\n\t\t\tctx.value.min_values !== undefined &&\n\t\t\tctx.value.max_values !== undefined &&\n\t\t\tctx.value.min_values > ctx.value.max_values\n\t\t) {\n\t\t\tctx.issues.push({\n\t\t\t\tcode: 'too_big',\n\t\t\t\tmessage: `The maximum amount of options must be greater than or equal to the minimum amount of options`,\n\t\t\t\tinclusive: true,\n\t\t\t\tmaximum: ctx.value.max_values,\n\t\t\t\ttype: 'number',\n\t\t\t\tpath: ['min_values'],\n\t\t\t\torigin: 'number',\n\t\t\t\tinput: ctx.value.min_values,\n\t\t\t});\n\t\t}\n\t});\n\nexport const selectMenuUserPredicate = selectMenuBasePredicate.extend({\n\ttype: z.literal(ComponentType.UserSelect),\n\tdefault_values: z\n\t\t.object({ id: snowflakePredicate, type: z.literal(SelectMenuDefaultValueType.User) })\n\t\t.array()\n\t\t.max(25)\n\t\t.optional(),\n});\n\nexport const actionRowPredicate = z.object({\n\tid: idPredicate,\n\ttype: z.literal(ComponentType.ActionRow),\n\tcomponents: z.union([\n\t\tz\n\t\t\t.object({ type: z.literal(ComponentType.Button) })\n\t\t\t.array()\n\t\t\t.min(1)\n\t\t\t.max(5),\n\t\tz\n\t\t\t.object({\n\t\t\t\ttype: z.literal([\n\t\t\t\t\tComponentType.ChannelSelect,\n\t\t\t\t\tComponentType.MentionableSelect,\n\t\t\t\t\tComponentType.StringSelect,\n\t\t\t\t\tComponentType.RoleSelect,\n\t\t\t\t\tComponentType.TextInput,\n\t\t\t\t\tComponentType.UserSelect,\n\t\t\t\t]),\n\t\t\t})\n\t\t\t.array()\n\t\t\t.length(1),\n\t]),\n});\n","import { Locale } from 'discord-api-types/v10';\nimport { z } from 'zod';\n\nexport const idPredicate = z.int().min(0).max(2_147_483_647).optional();\nexport const customIdPredicate = z.string().min(1).max(100);\nexport const snowflakePredicate = z.string().regex(/^(?:0|[1-9]\\d*)$/);\n\nexport const memberPermissionsPredicate = z.coerce.bigint();\n\nexport const localeMapPredicate = z.strictObject(\n\tObject.fromEntries(Object.values(Locale).map((loc) => [loc, z.string().optional()])) as Record<\n\t\tLocale,\n\t\tz.ZodOptional<z.ZodString>\n\t>,\n);\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIBaseComponent, ComponentType } from 'discord-api-types/v10';\n\nexport interface ComponentBuilderBaseData {\n\tid?: number | undefined;\n}\n\n/**\n * The base component builder that contains common symbols for all sorts of components.\n *\n * @typeParam Component - The type of API data that is stored within the builder\n */\nexport abstract class ComponentBuilder<\n\tComponent extends APIBaseComponent<ComponentType>,\n> implements JSONEncodable<Component> {\n\t/**\n\t * @internal\n\t */\n\tprotected abstract readonly data: ComponentBuilderBaseData;\n\n\t/**\n\t * Sets the id of this component.\n\t *\n\t * @param id - The id to use\n\t */\n\tpublic setId(id: number) {\n\t\tthis.data.id = id;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the id of this component, defaulting to a default incremented id.\n\t */\n\tpublic clearId() {\n\t\tthis.data.id = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic abstract toJSON(validationOverride?: boolean): Component;\n}\n","import type { APIButtonComponent } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { buttonPredicate } from '../Assertions.js';\nimport { ComponentBuilder } from '../Component.js';\n\n/**\n * A builder that creates API-compatible JSON data for buttons.\n */\nexport abstract class BaseButtonBuilder<ButtonData extends APIButtonComponent> extends ComponentBuilder<ButtonData> {\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: Partial<ButtonData>;\n\n\t/**\n\t * Sets whether this button is disabled.\n\t *\n\t * @param disabled - Whether to disable this button\n\t */\n\tpublic setDisabled(disabled = true) {\n\t\tthis.data.disabled = disabled;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): ButtonData {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(buttonPredicate, clone, validationOverride);\n\n\t\treturn clone as ButtonData;\n\t}\n}\n","import { ButtonStyle, ComponentType, type APIButtonComponentWithCustomId } from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { BaseButtonBuilder } from './Button.js';\nimport { EmojiOrLabelButtonMixin } from './mixins/EmojiOrLabelButtonMixin.js';\n\nexport type CustomIdButtonStyle = APIButtonComponentWithCustomId['style'];\n\n/**\n * A builder that creates API-compatible JSON data for buttons with custom IDs.\n *\n * @mixes {@link BaseButtonBuilder}\\<{@link discord-api-types/v10#(APIButtonComponentWithCustomId:interface)}\\>\n * @mixes {@link EmojiOrLabelButtonMixin}\n */\nexport abstract class CustomIdButtonBuilder extends Mixin(\n\tBaseButtonBuilder<APIButtonComponentWithCustomId>,\n\tEmojiOrLabelButtonMixin,\n) {\n\tprotected override readonly data: Partial<APIButtonComponentWithCustomId>;\n\n\tprotected constructor(data: Partial<APIButtonComponentWithCustomId> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.Button };\n\t}\n\n\t/**\n\t * Sets the custom id for this button.\n\t *\n\t * @remarks\n\t * This method is only applicable to buttons that are not using the `Link` button style.\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customId;\n\t\treturn this;\n\t}\n}\n\n/**\n * A builder that creates API-compatible JSON data for buttons with custom IDs (using the primary style).\n */\nexport class PrimaryButtonBuilder extends CustomIdButtonBuilder {\n\tpublic constructor(data: Partial<APIButtonComponentWithCustomId> = {}) {\n\t\tsuper({ ...data, style: ButtonStyle.Primary });\n\t}\n}\n\n/**\n * A builder that creates API-compatible JSON data for buttons with custom IDs (using the secondary style).\n */\nexport class SecondaryButtonBuilder extends CustomIdButtonBuilder {\n\tpublic constructor(data: Partial<APIButtonComponentWithCustomId> = {}) {\n\t\tsuper({ ...data, style: ButtonStyle.Secondary });\n\t}\n}\n\n/**\n * A builder that creates API-compatible JSON data for buttons with custom IDs (using the success style).\n */\nexport class SuccessButtonBuilder extends CustomIdButtonBuilder {\n\tpublic constructor(data: Partial<APIButtonComponentWithCustomId> = {}) {\n\t\tsuper({ ...data, style: ButtonStyle.Success });\n\t}\n}\n\n/**\n * A builder that creates API-compatible JSON data for buttons with custom IDs (using the danger style).\n */\nexport class DangerButtonBuilder extends CustomIdButtonBuilder {\n\tpublic constructor(data: Partial<APIButtonComponentWithCustomId> = {}) {\n\t\tsuper({ ...data, style: ButtonStyle.Danger });\n\t}\n}\n","import {\n\tButtonStyle,\n\tComponentType,\n\ttype APIButtonComponent,\n\ttype APIButtonComponentWithURL,\n} from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { BaseButtonBuilder } from './Button.js';\nimport { EmojiOrLabelButtonMixin } from './mixins/EmojiOrLabelButtonMixin.js';\n\n/**\n * A builder that creates API-compatible JSON data for buttons with links.\n *\n * @mixes {@link BaseButtonBuilder}\\<{@link discord-api-types/v10#(APIButtonComponentWithURL:interface)}\\>\n * @mixes {@link EmojiOrLabelButtonMixin}\n */\nexport class LinkButtonBuilder extends Mixin(BaseButtonBuilder<APIButtonComponentWithURL>, EmojiOrLabelButtonMixin) {\n\tprotected override readonly data: Partial<APIButtonComponentWithURL>;\n\n\tpublic constructor(data: Partial<APIButtonComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.Button, style: ButtonStyle.Link };\n\t}\n\n\t/**\n\t * Sets the URL for this button.\n\t *\n\t * @remarks\n\t * This method is only available to buttons using the `Link` button style.\n\t * Only three types of URL schemes are currently supported: `https://`, `http://`, and `discord://`.\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.url = url;\n\t\treturn this;\n\t}\n}\n","import type { APIButtonComponentWithSKUId, Snowflake } from 'discord-api-types/v10';\nimport { ButtonStyle, ComponentType } from 'discord-api-types/v10';\nimport { BaseButtonBuilder } from './Button.js';\n\n/**\n * A builder that creates API-compatible JSON data for premium buttons.\n */\nexport class PremiumButtonBuilder extends BaseButtonBuilder<APIButtonComponentWithSKUId> {\n\tprotected override readonly data: Partial<APIButtonComponentWithSKUId>;\n\n\tpublic constructor(data: Partial<APIButtonComponentWithSKUId> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.Button, style: ButtonStyle.Premium };\n\t}\n\n\t/**\n\t * Sets the SKU id that represents a purchasable SKU for this button.\n\t *\n\t * @remarks Only available when using premium-style buttons.\n\t * @param skuId - The SKU id to use\n\t */\n\tpublic setSKUId(skuId: Snowflake) {\n\t\tthis.data.sku_id = skuId;\n\t\treturn this;\n\t}\n}\n","import type { APIFileUploadComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { fileUploadPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for file uploads.\n */\nexport class FileUploadBuilder extends ComponentBuilder<APIFileUploadComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: Partial<APIFileUploadComponent>;\n\n\t/**\n\t * Creates a new file upload.\n\t *\n\t * @param data - The API data to create this file upload with\n\t * @example\n\t * Creating a file upload from an API data object:\n\t * ```ts\n\t * const fileUpload = new FileUploadBuilder({\n\t * \tcustom_id: \"file_upload\",\n\t * min_values: 2,\n\t * max_values: 5,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a file upload using setters and API data:\n\t * ```ts\n\t * const fileUpload = new FileUploadBuilder({\n\t * \tcustom_id: \"file_upload\",\n\t * min_values: 2,\n\t * max_values: 5,\n\t * }).setRequired();\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIFileUploadComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.FileUpload };\n\t}\n\n\t/**\n\t * Sets the custom id for this file upload.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customId;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum number of file uploads required.\n\t *\n\t * @param minValues - The minimum values that must be uploaded\n\t */\n\tpublic setMinValues(minValues: number) {\n\t\tthis.data.min_values = minValues;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the minimum values.\n\t */\n\tpublic clearMinValues() {\n\t\tthis.data.min_values = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum number of file uploads required.\n\t *\n\t * @param maxValues - The maximum values that can be uploaded\n\t */\n\tpublic setMaxValues(maxValues: number) {\n\t\tthis.data.max_values = maxValues;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the maximum values.\n\t */\n\tpublic clearMaxValues() {\n\t\tthis.data.max_values = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this file upload is required.\n\t *\n\t * @param required - Whether this file upload is required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = required;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIFileUploadComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(fileUploadPredicate, clone, validationOverride);\n\n\t\treturn clone as APIFileUploadComponent;\n\t}\n}\n","import { ComponentType } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { customIdPredicate, idPredicate } from '../../Assertions';\n\nexport const fileUploadPredicate = z.object({\n\ttype: z.literal(ComponentType.FileUpload),\n\tid: idPredicate,\n\tcustom_id: customIdPredicate,\n\tmin_values: z.int().min(0).max(10).optional(),\n\tmax_values: z.int().min(1).max(10).optional(),\n\trequired: z.boolean().optional(),\n});\n","import type {\n\tAPIChannelSelectComponent,\n\tAPIFileUploadComponent,\n\tAPILabelComponent,\n\tAPIMentionableSelectComponent,\n\tAPIRoleSelectComponent,\n\tAPIStringSelectComponent,\n\tAPITextInputComponent,\n\tAPIUserSelectComponent,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { resolveBuilder } from '../../util/resolveBuilder.js';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { createComponentBuilder } from '../Components.js';\nimport { FileUploadBuilder } from '../fileUpload/FileUpload.js';\nimport { ChannelSelectMenuBuilder } from '../selectMenu/ChannelSelectMenu.js';\nimport { MentionableSelectMenuBuilder } from '../selectMenu/MentionableSelectMenu.js';\nimport { RoleSelectMenuBuilder } from '../selectMenu/RoleSelectMenu.js';\nimport { StringSelectMenuBuilder } from '../selectMenu/StringSelectMenu.js';\nimport { UserSelectMenuBuilder } from '../selectMenu/UserSelectMenu.js';\nimport { TextInputBuilder } from '../textInput/TextInput.js';\nimport { labelPredicate } from './Assertions.js';\n\nexport interface LabelBuilderData extends Partial<Omit<APILabelComponent, 'component'>> {\n\tcomponent?:\n\t\t| ChannelSelectMenuBuilder\n\t\t| FileUploadBuilder\n\t\t| MentionableSelectMenuBuilder\n\t\t| RoleSelectMenuBuilder\n\t\t| StringSelectMenuBuilder\n\t\t| TextInputBuilder\n\t\t| UserSelectMenuBuilder;\n}\n\n/**\n * A builder that creates API-compatible JSON data for labels.\n */\nexport class LabelBuilder extends ComponentBuilder<APILabelComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: LabelBuilderData;\n\n\t/**\n\t * Creates a new label.\n\t *\n\t * @param data - The API data to create this label with\n\t * @example\n\t * Creating a label from an API data object:\n\t * ```ts\n\t * const label = new LabelBuilder({\n\t * \tlabel: \"label\",\n\t * \tcomponent,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a label using setters and API data:\n\t * ```ts\n\t * const label = new LabelBuilder({\n\t * \tlabel: 'label',\n\t * \tcomponent,\n\t * }).setContent('new text');\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APILabelComponent> = {}) {\n\t\tsuper();\n\n\t\tconst { component, ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tcomponent: component ? createComponentBuilder(component) : undefined,\n\t\t\ttype: ComponentType.Label,\n\t\t};\n\t}\n\n\t/**\n\t * Sets the label for this label.\n\t *\n\t * @param label - The label to use\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = label;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description for this label.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = description;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description for this label.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a string select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setStringSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIStringSelectComponent\n\t\t\t| StringSelectMenuBuilder\n\t\t\t| ((builder: StringSelectMenuBuilder) => StringSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, StringSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a user select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setUserSelectMenuComponent(\n\t\tinput: APIUserSelectComponent | UserSelectMenuBuilder | ((builder: UserSelectMenuBuilder) => UserSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, UserSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a role select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setRoleSelectMenuComponent(\n\t\tinput: APIRoleSelectComponent | RoleSelectMenuBuilder | ((builder: RoleSelectMenuBuilder) => RoleSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, RoleSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a mentionable select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setMentionableSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIMentionableSelectComponent\n\t\t\t| MentionableSelectMenuBuilder\n\t\t\t| ((builder: MentionableSelectMenuBuilder) => MentionableSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, MentionableSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a channel select menu component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setChannelSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIChannelSelectComponent\n\t\t\t| ChannelSelectMenuBuilder\n\t\t\t| ((builder: ChannelSelectMenuBuilder) => ChannelSelectMenuBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, ChannelSelectMenuBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a text input component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setTextInputComponent(\n\t\tinput: APITextInputComponent | TextInputBuilder | ((builder: TextInputBuilder) => TextInputBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, TextInputBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a file upload component to this label.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic setFileUploadComponent(\n\t\tinput: APIFileUploadComponent | FileUploadBuilder | ((builder: FileUploadBuilder) => FileUploadBuilder),\n\t): this {\n\t\tthis.data.component = resolveBuilder(input, FileUploadBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APILabelComponent {\n\t\tconst { component, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\t// The label predicate validates the component.\n\t\t\tcomponent: component?.toJSON(false),\n\t\t};\n\n\t\tvalidate(labelPredicate, data, validationOverride);\n\n\t\treturn data as APILabelComponent;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\n\n/**\n * @privateRemarks\n * This is a type-guard util, because if you were to in-line `builder instanceof Constructor` in the `resolveBuilder`\n * function, TS doesn't narrow out the type `Builder`, causing a type error on the last return statement.\n * @internal\n */\nfunction isBuilder<Builder extends JSONEncodable<any>>(\n\tbuilder: unknown,\n\tConstructor: new () => Builder,\n): builder is Builder {\n\treturn builder instanceof Constructor;\n}\n\n/**\n * \"Resolves\" a builder from the 3 ways it can be input:\n * 1. A clean instance\n * 2. A data object that can be used to construct the builder\n * 3. A function that takes a builder and returns a builder e.g. `builder => builder.setFoo('bar')`\n *\n * @typeParam Builder - The builder type\n * @typeParam BuilderData - The data object that can be used to construct the builder\n * @param builder - The user input, as described in the function description\n * @param Constructor - The constructor of the builder\n */\nexport function resolveBuilder<Builder extends JSONEncodable<any>, BuilderData extends Record<PropertyKey, any>>(\n\tbuilder: Builder | BuilderData | ((builder: Builder) => Builder),\n\tConstructor: new (data?: BuilderData) => Builder,\n): Builder {\n\tif (isBuilder(builder, Constructor)) {\n\t\treturn builder;\n\t}\n\n\tif (typeof builder === 'function') {\n\t\treturn builder(new Constructor());\n\t}\n\n\treturn new Constructor(builder);\n}\n","import type {\n\tAPIBaseComponent,\n\tAPIButtonComponent,\n\tAPIMessageComponent,\n\tAPIModalComponent,\n\tAPISectionAccessoryComponent,\n} from 'discord-api-types/v10';\nimport { ButtonStyle, ComponentType } from 'discord-api-types/v10';\nimport { ActionRowBuilder } from './ActionRow.js';\nimport { ComponentBuilder } from './Component.js';\nimport type { BaseButtonBuilder } from './button/Button.js';\nimport {\n\tDangerButtonBuilder,\n\tPrimaryButtonBuilder,\n\tSecondaryButtonBuilder,\n\tSuccessButtonBuilder,\n} from './button/CustomIdButton.js';\nimport { LinkButtonBuilder } from './button/LinkButton.js';\nimport { PremiumButtonBuilder } from './button/PremiumButton.js';\nimport { FileUploadBuilder } from './fileUpload/FileUpload.js';\nimport { LabelBuilder } from './label/Label.js';\nimport { ChannelSelectMenuBuilder } from './selectMenu/ChannelSelectMenu.js';\nimport { MentionableSelectMenuBuilder } from './selectMenu/MentionableSelectMenu.js';\nimport { RoleSelectMenuBuilder } from './selectMenu/RoleSelectMenu.js';\nimport { StringSelectMenuBuilder } from './selectMenu/StringSelectMenu.js';\nimport { UserSelectMenuBuilder } from './selectMenu/UserSelectMenu.js';\nimport { TextInputBuilder } from './textInput/TextInput.js';\nimport { ContainerBuilder } from './v2/Container.js';\nimport { FileBuilder } from './v2/File.js';\nimport { MediaGalleryBuilder } from './v2/MediaGallery.js';\nimport { SectionBuilder } from './v2/Section.js';\nimport { SeparatorBuilder } from './v2/Separator.js';\nimport { TextDisplayBuilder } from './v2/TextDisplay.js';\nimport { ThumbnailBuilder } from './v2/Thumbnail.js';\n\n/**\n * The builders that may be used as top-level components on messages\n */\nexport type MessageTopLevelComponentBuilder =\n\t| ActionRowBuilder\n\t| ContainerBuilder\n\t| FileBuilder\n\t| MediaGalleryBuilder\n\t| SectionBuilder\n\t| SeparatorBuilder\n\t| TextDisplayBuilder;\n\n/**\n * The builders that may be used for messages.\n */\nexport type MessageComponentBuilder =\n\t| MessageActionRowComponentBuilder\n\t| MessageTopLevelComponentBuilder\n\t| ThumbnailBuilder;\n\n/**\n * The builders that may be used for modals.\n */\nexport type ModalComponentBuilder =\n\t| ActionRowBuilder\n\t| FileUploadBuilder\n\t| LabelBuilder\n\t| ModalActionRowComponentBuilder;\n\n/**\n * Any button builder\n */\nexport type ButtonBuilder =\n\t| DangerButtonBuilder\n\t| LinkButtonBuilder\n\t| PremiumButtonBuilder\n\t| PrimaryButtonBuilder\n\t| SecondaryButtonBuilder\n\t| SuccessButtonBuilder;\n\n/**\n * The builders that may be used within an action row for messages.\n */\nexport type MessageActionRowComponentBuilder =\n\t| ButtonBuilder\n\t| ChannelSelectMenuBuilder\n\t| MentionableSelectMenuBuilder\n\t| RoleSelectMenuBuilder\n\t| StringSelectMenuBuilder\n\t| UserSelectMenuBuilder;\n\n/**\n * The builders that may be used within an action row for modals.\n */\nexport type ModalActionRowComponentBuilder = TextInputBuilder;\n\n/**\n * Any action row component builder.\n */\nexport type AnyActionRowComponentBuilder = MessageActionRowComponentBuilder | ModalActionRowComponentBuilder;\n\n/**\n * Any modal component builder.\n */\nexport type AnyModalComponentBuilder = FileUploadBuilder | LabelBuilder | TextDisplayBuilder;\n\n/**\n * Components here are mapped to their respective builder.\n */\nexport interface MappedComponentTypes {\n\t/**\n\t * The action row component type is associated with an {@link ActionRowBuilder}.\n\t */\n\t[ComponentType.ActionRow]: ActionRowBuilder;\n\t/**\n\t * The button component type is associated with a {@link BaseButtonBuilder}.\n\t */\n\t[ComponentType.Button]: ButtonBuilder;\n\t/**\n\t * The string select component type is associated with a {@link StringSelectMenuBuilder}.\n\t */\n\t[ComponentType.StringSelect]: StringSelectMenuBuilder;\n\t/**\n\t * The text input component type is associated with a {@link TextInputBuilder}.\n\t */\n\t[ComponentType.TextInput]: TextInputBuilder;\n\t/**\n\t * The user select component type is associated with a {@link UserSelectMenuBuilder}.\n\t */\n\t[ComponentType.UserSelect]: UserSelectMenuBuilder;\n\t/**\n\t * The role select component type is associated with a {@link RoleSelectMenuBuilder}.\n\t */\n\t[ComponentType.RoleSelect]: RoleSelectMenuBuilder;\n\t/**\n\t * The mentionable select component type is associated with a {@link MentionableSelectMenuBuilder}.\n\t */\n\t[ComponentType.MentionableSelect]: MentionableSelectMenuBuilder;\n\t/**\n\t * The channel select component type is associated with a {@link ChannelSelectMenuBuilder}.\n\t */\n\t[ComponentType.ChannelSelect]: ChannelSelectMenuBuilder;\n\t/**\n\t * The thumbnail component type is associated with a {@link ThumbnailBuilder}.\n\t */\n\t[ComponentType.Thumbnail]: ThumbnailBuilder;\n\t/**\n\t * The file component type is associated with a {@link FileBuilder}.\n\t */\n\t[ComponentType.File]: FileBuilder;\n\t/**\n\t * The separator component type is associated with a {@link SeparatorBuilder}.\n\t */\n\t[ComponentType.Separator]: SeparatorBuilder;\n\t/**\n\t * The text display component type is associated with a {@link TextDisplayBuilder}.\n\t */\n\t[ComponentType.TextDisplay]: TextDisplayBuilder;\n\t/**\n\t * The media gallery component type is associated with a {@link MediaGalleryBuilder}.\n\t */\n\t[ComponentType.MediaGallery]: MediaGalleryBuilder;\n\t/**\n\t * The section component type is associated with a {@link SectionBuilder}.\n\t */\n\t[ComponentType.Section]: SectionBuilder;\n\t/**\n\t * The container component type is associated with a {@link ContainerBuilder}.\n\t */\n\t[ComponentType.Container]: ContainerBuilder;\n\t/**\n\t * The label component type is associated with a {@link LabelBuilder}.\n\t */\n\t[ComponentType.Label]: LabelBuilder;\n\t/**\n\t * The file upload component type is associated with a {@link FileUploadBuilder}.\n\t */\n\t[ComponentType.FileUpload]: FileUploadBuilder;\n}\n\n/**\n * Factory for creating components from API data.\n *\n * @typeParam ComponentType - The type of component to use\n * @param data - The API data to transform to a component class\n */\nexport function createComponentBuilder<ComponentType extends keyof MappedComponentTypes>(\n\t// eslint-disable-next-line @typescript-eslint/sort-type-constituents\n\tdata: (APIModalComponent | APIMessageComponent) & { type: ComponentType },\n): MappedComponentTypes[ComponentType];\n\n/**\n * Factory for creating components from API data.\n *\n * @typeParam ComponentBuilder - The type of component to use\n * @param data - The API data to transform to a component class\n */\nexport function createComponentBuilder<ComponentBuilder extends MessageComponentBuilder | ModalComponentBuilder>(\n\tdata: ComponentBuilder,\n): ComponentBuilder;\n\nexport function createComponentBuilder(\n\tdata: APIMessageComponent | APIModalComponent | MessageComponentBuilder,\n): ComponentBuilder<APIBaseComponent<ComponentType>> {\n\tif (data instanceof ComponentBuilder) {\n\t\treturn data;\n\t}\n\n\tswitch (data.type) {\n\t\tcase ComponentType.ActionRow:\n\t\t\treturn new ActionRowBuilder(data);\n\t\tcase ComponentType.Button:\n\t\t\treturn createButtonBuilder(data);\n\t\tcase ComponentType.StringSelect:\n\t\t\treturn new StringSelectMenuBuilder(data);\n\t\tcase ComponentType.TextInput:\n\t\t\treturn new TextInputBuilder(data);\n\t\tcase ComponentType.UserSelect:\n\t\t\treturn new UserSelectMenuBuilder(data);\n\t\tcase ComponentType.RoleSelect:\n\t\t\treturn new RoleSelectMenuBuilder(data);\n\t\tcase ComponentType.MentionableSelect:\n\t\t\treturn new MentionableSelectMenuBuilder(data);\n\t\tcase ComponentType.ChannelSelect:\n\t\t\treturn new ChannelSelectMenuBuilder(data);\n\t\tcase ComponentType.Thumbnail:\n\t\t\treturn new ThumbnailBuilder(data);\n\t\tcase ComponentType.File:\n\t\t\treturn new FileBuilder(data);\n\t\tcase ComponentType.Separator:\n\t\t\treturn new SeparatorBuilder(data);\n\t\tcase ComponentType.TextDisplay:\n\t\t\treturn new TextDisplayBuilder(data);\n\t\tcase ComponentType.MediaGallery:\n\t\t\treturn new MediaGalleryBuilder(data);\n\t\tcase ComponentType.Section:\n\t\t\treturn new SectionBuilder(data);\n\t\tcase ComponentType.Container:\n\t\t\treturn new ContainerBuilder(data);\n\t\tcase ComponentType.Label:\n\t\t\treturn new LabelBuilder(data);\n\t\tcase ComponentType.FileUpload:\n\t\t\treturn new FileUploadBuilder(data);\n\t\tdefault:\n\t\t\t// @ts-expect-error This case can still occur if we get a newer unsupported component type\n\t\t\tthrow new Error(`Cannot properly serialize component type: ${data.type}`);\n\t}\n}\n\nfunction createButtonBuilder(data: APIButtonComponent): ButtonBuilder {\n\tswitch (data.style) {\n\t\tcase ButtonStyle.Primary:\n\t\t\treturn new PrimaryButtonBuilder(data);\n\t\tcase ButtonStyle.Secondary:\n\t\t\treturn new SecondaryButtonBuilder(data);\n\t\tcase ButtonStyle.Success:\n\t\t\treturn new SuccessButtonBuilder(data);\n\t\tcase ButtonStyle.Danger:\n\t\t\treturn new DangerButtonBuilder(data);\n\t\tcase ButtonStyle.Link:\n\t\t\treturn new LinkButtonBuilder(data);\n\t\tcase ButtonStyle.Premium:\n\t\t\treturn new PremiumButtonBuilder(data);\n\t\tdefault:\n\t\t\t// @ts-expect-error This case can still occur if we get a newer unsupported button style\n\t\t\tthrow new Error(`Cannot properly serialize button with style: ${data.style}`);\n\t}\n}\n\nexport function resolveAccessoryComponent(component: APISectionAccessoryComponent) {\n\tswitch (component.type) {\n\t\tcase ComponentType.Button:\n\t\t\treturn createButtonBuilder(component);\n\t\tcase ComponentType.Thumbnail:\n\t\t\treturn new ThumbnailBuilder(component);\n\t\tdefault:\n\t\t\t// @ts-expect-error This case can still occur if we get a newer unsupported component type\n\t\t\tthrow new Error(`Cannot properly serialize section accessory component: ${component.type}`);\n\t}\n}\n","import type {\n\tAPITextInputComponent,\n\tAPIActionRowComponent,\n\tAPIComponentInActionRow,\n\tAPIChannelSelectComponent,\n\tAPIMentionableSelectComponent,\n\tAPIRoleSelectComponent,\n\tAPIStringSelectComponent,\n\tAPIUserSelectComponent,\n\tAPIButtonComponentWithCustomId,\n\tAPIButtonComponentWithSKUId,\n\tAPIButtonComponentWithURL,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../util/normalizeArray.js';\nimport { resolveBuilder } from '../util/resolveBuilder.js';\nimport { validate } from '../util/validation.js';\nimport { actionRowPredicate } from './Assertions.js';\nimport { ComponentBuilder } from './Component.js';\nimport type { AnyActionRowComponentBuilder } from './Components.js';\nimport { createComponentBuilder } from './Components.js';\nimport {\n\tDangerButtonBuilder,\n\tPrimaryButtonBuilder,\n\tSecondaryButtonBuilder,\n\tSuccessButtonBuilder,\n} from './button/CustomIdButton.js';\nimport { LinkButtonBuilder } from './button/LinkButton.js';\nimport { PremiumButtonBuilder } from './button/PremiumButton.js';\nimport { ChannelSelectMenuBuilder } from './selectMenu/ChannelSelectMenu.js';\nimport { MentionableSelectMenuBuilder } from './selectMenu/MentionableSelectMenu.js';\nimport { RoleSelectMenuBuilder } from './selectMenu/RoleSelectMenu.js';\nimport { StringSelectMenuBuilder } from './selectMenu/StringSelectMenu.js';\nimport { UserSelectMenuBuilder } from './selectMenu/UserSelectMenu.js';\nimport { TextInputBuilder } from './textInput/TextInput.js';\n\nexport interface ActionRowBuilderData extends Partial<\n\tOmit<APIActionRowComponent<APIComponentInActionRow>, 'components'>\n> {\n\tcomponents: AnyActionRowComponentBuilder[];\n}\n\n/**\n * A builder that creates API-compatible JSON data for action rows.\n */\nexport class ActionRowBuilder extends ComponentBuilder<APIActionRowComponent<APIComponentInActionRow>> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: ActionRowBuilderData;\n\n\t/**\n\t * The components within this action row.\n\t */\n\tpublic get components(): readonly AnyActionRowComponentBuilder[] {\n\t\treturn this.data.components;\n\t}\n\n\t/**\n\t * Creates a new action row.\n\t *\n\t * @param data - The API data to create this action row with\n\t * @example\n\t * Creating an action row from an API data object:\n\t * ```ts\n\t * const actionRow = new ActionRowBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcustom_id: \"custom id\",\n\t * \t\t\tlabel: \"Type something\",\n\t * \t\t\tstyle: TextInputStyle.Short,\n\t * \t\t\ttype: ComponentType.TextInput,\n\t * \t\t},\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating an action row using setters and API data:\n\t * ```ts\n\t * const actionRow = new ActionRowBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcustom_id: \"custom id\",\n\t * \t\t\tlabel: \"Click me\",\n\t * \t\t\tstyle: ButtonStyle.Primary,\n\t * \t\t\ttype: ComponentType.Button,\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.addComponents(button2, button3);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIActionRowComponent<APIComponentInActionRow>> = {}) {\n\t\tsuper();\n\n\t\tconst { components = [], ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tcomponents: components.map((component) => createComponentBuilder(component)),\n\t\t\ttype: ComponentType.ActionRow,\n\t\t};\n\t}\n\n\t/**\n\t * Adds primary button components to this action row.\n\t *\n\t * @param input - The buttons to add\n\t */\n\tpublic addPrimaryButtonComponents(\n\t\t...input: RestOrArray<\n\t\t\tAPIButtonComponentWithCustomId | PrimaryButtonBuilder | ((builder: PrimaryButtonBuilder) => PrimaryButtonBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, PrimaryButtonBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds secondary button components to this action row.\n\t *\n\t * @param input - The buttons to add\n\t */\n\tpublic addSecondaryButtonComponents(\n\t\t...input: RestOrArray<\n\t\t\t| APIButtonComponentWithCustomId\n\t\t\t| SecondaryButtonBuilder\n\t\t\t| ((builder: SecondaryButtonBuilder) => SecondaryButtonBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, SecondaryButtonBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds success button components to this action row.\n\t *\n\t * @param input - The buttons to add\n\t */\n\tpublic addSuccessButtonComponents(\n\t\t...input: RestOrArray<\n\t\t\tAPIButtonComponentWithCustomId | SuccessButtonBuilder | ((builder: SuccessButtonBuilder) => SuccessButtonBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, SuccessButtonBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds danger button components to this action row.\n\t */\n\tpublic addDangerButtonComponents(\n\t\t...input: RestOrArray<\n\t\t\tAPIButtonComponentWithCustomId | DangerButtonBuilder | ((builder: DangerButtonBuilder) => DangerButtonBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, DangerButtonBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Generically add any type of component to this action row, only takes in an instance of a component builder.\n\t */\n\tpublic addComponents(...input: RestOrArray<AnyActionRowComponentBuilder>): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tthis.data.components.push(...normalized);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds SKU id button components to this action row.\n\t *\n\t * @param input - The buttons to add\n\t */\n\tpublic addPremiumButtonComponents(\n\t\t...input: RestOrArray<\n\t\t\tAPIButtonComponentWithSKUId | PremiumButtonBuilder | ((builder: PremiumButtonBuilder) => PremiumButtonBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, PremiumButtonBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds URL button components to this action row.\n\t *\n\t * @param input - The buttons to add\n\t */\n\tpublic addLinkButtonComponents(\n\t\t...input: RestOrArray<\n\t\t\tAPIButtonComponentWithURL | LinkButtonBuilder | ((builder: LinkButtonBuilder) => LinkButtonBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, LinkButtonBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a channel select menu component to this action row.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic addChannelSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIChannelSelectComponent\n\t\t\t| ChannelSelectMenuBuilder\n\t\t\t| ((builder: ChannelSelectMenuBuilder) => ChannelSelectMenuBuilder),\n\t): this {\n\t\tthis.data.components.push(resolveBuilder(input, ChannelSelectMenuBuilder));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a mentionable select menu component to this action row.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic addMentionableSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIMentionableSelectComponent\n\t\t\t| MentionableSelectMenuBuilder\n\t\t\t| ((builder: MentionableSelectMenuBuilder) => MentionableSelectMenuBuilder),\n\t): this {\n\t\tthis.data.components.push(resolveBuilder(input, MentionableSelectMenuBuilder));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a role select menu component to this action row.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic addRoleSelectMenuComponent(\n\t\tinput: APIRoleSelectComponent | RoleSelectMenuBuilder | ((builder: RoleSelectMenuBuilder) => RoleSelectMenuBuilder),\n\t): this {\n\t\tthis.data.components.push(resolveBuilder(input, RoleSelectMenuBuilder));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a string select menu component to this action row.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic addStringSelectMenuComponent(\n\t\tinput:\n\t\t\t| APIStringSelectComponent\n\t\t\t| StringSelectMenuBuilder\n\t\t\t| ((builder: StringSelectMenuBuilder) => StringSelectMenuBuilder),\n\t): this {\n\t\tthis.data.components.push(resolveBuilder(input, StringSelectMenuBuilder));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a user select menu component to this action row.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic addUserSelectMenuComponent(\n\t\tinput: APIUserSelectComponent | UserSelectMenuBuilder | ((builder: UserSelectMenuBuilder) => UserSelectMenuBuilder),\n\t): this {\n\t\tthis.data.components.push(resolveBuilder(input, UserSelectMenuBuilder));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a text input component to this action row.\n\t *\n\t * @param input - A function that returns a component builder or an already built builder\n\t */\n\tpublic addTextInputComponent(\n\t\tinput: APITextInputComponent | TextInputBuilder | ((builder: TextInputBuilder) => TextInputBuilder),\n\t): this {\n\t\tthis.data.components.push(resolveBuilder(input, TextInputBuilder));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts components for this action row.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing components of an action row.\n\t * @example\n\t * Remove the first component:\n\t * ```ts\n\t * actionRow.spliceComponents(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n components:\n\t * ```ts\n\t * const n = 4;\n\t * actionRow.spliceComponents(0, n);\n\t * ```\n\t * @example\n\t * Remove the last component:\n\t * ```ts\n\t * actionRow.spliceComponents(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of components to remove\n\t * @param components - The replacing component objects\n\t */\n\tpublic spliceComponents(index: number, deleteCount: number, ...components: AnyActionRowComponentBuilder[]): this {\n\t\tthis.data.components.splice(index, deleteCount, ...components);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIActionRowComponent<APIComponentInActionRow> {\n\t\tconst { components, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\tcomponents: components.map((component) => component.toJSON(validationOverride)),\n\t\t};\n\n\t\tvalidate(actionRowPredicate, data, validationOverride);\n\n\t\treturn data as APIActionRowComponent<APIComponentInActionRow>;\n\t}\n}\n","/**\n * Normalizes data that is a rest parameter or an array into an array with a depth of 1.\n *\n * @typeParam ItemType - The data that must satisfy {@link RestOrArray}.\n * @param arr - The (possibly variadic) data to normalize\n */\nexport function normalizeArray<ItemType>(arr: RestOrArray<ItemType>): ItemType[] {\n\tif (Array.isArray(arr[0])) return [...arr[0]];\n\treturn arr as ItemType[];\n}\n\n/**\n * Represents data that may be an array or came from a rest parameter.\n *\n * @remarks\n * This type is used throughout builders to ensure both an array and variadic arguments\n * may be used. It is normalized with {@link normalizeArray}.\n */\nexport type RestOrArray<Type> = Type[] | [Type[]];\n","import {\n\ttype APIChannelSelectComponent,\n\ttype ChannelType,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { validate } from '../../util/validation.js';\nimport { selectMenuChannelPredicate } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for channel select menus.\n */\nexport class ChannelSelectMenuBuilder extends BaseSelectMenuBuilder<APIChannelSelectComponent> {\n\tprotected override readonly data: Partial<APIChannelSelectComponent>;\n\n\t/**\n\t * Creates a new channel select menu.\n\t *\n\t * @param data - The API data to create this channel select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new ChannelSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new ChannelSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.addChannelTypes(ChannelType.GuildText, ChannelType.GuildAnnouncement)\n\t * \t.setMinValues(2);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIChannelSelectComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.ChannelSelect };\n\t}\n\n\t/**\n\t * Adds channel types to this select menu.\n\t *\n\t * @param types - The channel types to use\n\t */\n\tpublic addChannelTypes(...types: RestOrArray<ChannelType>) {\n\t\tconst normalizedTypes = normalizeArray(types);\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.push(...normalizedTypes);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets channel types for this select menu.\n\t *\n\t * @param types - The channel types to use\n\t */\n\tpublic setChannelTypes(...types: RestOrArray<ChannelType>) {\n\t\tconst normalizedTypes = normalizeArray(types);\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.splice(0, this.data.channel_types.length, ...normalizedTypes);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default channels to this auto populated select menu.\n\t *\n\t * @param channels - The channels to add\n\t */\n\tpublic addDefaultChannels(...channels: RestOrArray<Snowflake>) {\n\t\tconst normalizedValues = normalizeArray(channels);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Channel as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default channels for this auto populated select menu.\n\t *\n\t * @param channels - The channels to set\n\t */\n\tpublic setDefaultChannels(...channels: RestOrArray<Snowflake>) {\n\t\tconst normalizedValues = normalizeArray(channels);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.Channel as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIChannelSelectComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(selectMenuChannelPredicate, clone, validationOverride);\n\n\t\treturn clone as APIChannelSelectComponent;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APISelectMenuComponent } from 'discord-api-types/v10';\nimport { ComponentBuilder } from '../Component.js';\n\n/**\n * The base select menu builder that contains common symbols for select menu builders.\n *\n * @typeParam Data - The type of API data that is stored within the builder\n */\nexport abstract class BaseSelectMenuBuilder<Data extends APISelectMenuComponent>\n\textends ComponentBuilder<Data>\n\timplements JSONEncodable<APISelectMenuComponent>\n{\n\t/**\n\t * @internal\n\t */\n\tprotected abstract override readonly data: Partial<\n\t\tPick<Data, 'custom_id' | 'disabled' | 'id' | 'max_values' | 'min_values' | 'placeholder' | 'required'>\n\t>;\n\n\t/**\n\t * Sets the placeholder for this select menu.\n\t *\n\t * @param placeholder - The placeholder to use\n\t */\n\tpublic setPlaceholder(placeholder: string) {\n\t\tthis.data.placeholder = placeholder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the placeholder for this select menu.\n\t */\n\tpublic clearPlaceholder() {\n\t\tthis.data.placeholder = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum values that must be selected in the select menu.\n\t *\n\t * @param minValues - The minimum values that must be selected\n\t */\n\tpublic setMinValues(minValues: number) {\n\t\tthis.data.min_values = minValues;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum values that can be selected in the select menu.\n\t *\n\t * @param maxValues - The maximum values that can be selected\n\t */\n\tpublic setMaxValues(maxValues: number) {\n\t\tthis.data.max_values = maxValues;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom id for this select menu.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customId;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this select menu is disabled.\n\t *\n\t * @param disabled - Whether this select menu is disabled\n\t */\n\tpublic setDisabled(disabled = true) {\n\t\tthis.data.disabled = disabled;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this select menu is required.\n\t *\n\t * @remarks Only for use in modals.\n\t * @param required - Whether this string select menu is required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = required;\n\t\treturn this;\n\t}\n}\n","import {\n\ttype APIMentionableSelectComponent,\n\ttype APISelectMenuDefaultValue,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { validate } from '../../util/validation.js';\nimport { selectMenuMentionablePredicate } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for mentionable select menus.\n */\nexport class MentionableSelectMenuBuilder extends BaseSelectMenuBuilder<APIMentionableSelectComponent> {\n\tprotected override readonly data: Partial<APIMentionableSelectComponent>;\n\n\t/**\n\t * Creates a new mentionable select menu.\n\t *\n\t * @param data - The API data to create this mentionable select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new MentionableSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new MentionableSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIMentionableSelectComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.MentionableSelect };\n\t}\n\n\t/**\n\t * Adds default roles to this auto populated select menu.\n\t *\n\t * @param roles - The roles to add\n\t */\n\tpublic addDefaultRoles(...roles: RestOrArray<Snowflake>) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default users to this auto populated select menu.\n\t *\n\t * @param users - The users to add\n\t */\n\tpublic addDefaultUsers(...users: RestOrArray<Snowflake>) {\n\t\tconst normalizedValues = normalizeArray(users);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds default values to this auto populated select menu.\n\t *\n\t * @param values - The values to add\n\t */\n\tpublic addDefaultValues(\n\t\t...values: RestOrArray<\n\t\t\t| APISelectMenuDefaultValue<SelectMenuDefaultValueType.Role>\n\t\t\t| APISelectMenuDefaultValue<SelectMenuDefaultValueType.User>\n\t\t>\n\t) {\n\t\tconst normalizedValues = normalizeArray(values);\n\t\tthis.data.default_values ??= [];\n\t\tthis.data.default_values.push(...normalizedValues);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default values for this auto populated select menu.\n\t *\n\t * @param values - The values to set\n\t */\n\tpublic setDefaultValues(\n\t\t...values: RestOrArray<\n\t\t\t| APISelectMenuDefaultValue<SelectMenuDefaultValueType.Role>\n\t\t\t| APISelectMenuDefaultValue<SelectMenuDefaultValueType.User>\n\t\t>\n\t) {\n\t\tconst normalizedValues = normalizeArray(values);\n\t\tthis.data.default_values = normalizedValues;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIMentionableSelectComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(selectMenuMentionablePredicate, clone, validationOverride);\n\n\t\treturn clone as APIMentionableSelectComponent;\n\t}\n}\n","import {\n\ttype APIRoleSelectComponent,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { validate } from '../../util/validation.js';\nimport { selectMenuRolePredicate } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for role select menus.\n */\nexport class RoleSelectMenuBuilder extends BaseSelectMenuBuilder<APIRoleSelectComponent> {\n\tprotected override readonly data: Partial<APIRoleSelectComponent>;\n\n\t/**\n\t * Creates a new role select menu.\n\t *\n\t * @param data - The API data to create this role select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new RoleSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new RoleSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIRoleSelectComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.RoleSelect };\n\t}\n\n\t/**\n\t * Adds default roles to this auto populated select menu.\n\t *\n\t * @param roles - The roles to add\n\t */\n\tpublic addDefaultRoles(...roles: RestOrArray<Snowflake>) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\t\tthis.data.default_values ??= [];\n\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default roles for this auto populated select menu.\n\t *\n\t * @param roles - The roles to set\n\t */\n\tpublic setDefaultRoles(...roles: RestOrArray<Snowflake>) {\n\t\tconst normalizedValues = normalizeArray(roles);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.Role as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIRoleSelectComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(selectMenuRolePredicate, clone, validationOverride);\n\n\t\treturn clone as APIRoleSelectComponent;\n\t}\n}\n","import { ComponentType } from 'discord-api-types/v10';\nimport type { APIStringSelectComponent, APISelectMenuOption } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../util/resolveBuilder.js';\nimport { validate } from '../../util/validation.js';\nimport { selectMenuStringPredicate } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\nimport { StringSelectMenuOptionBuilder } from './StringSelectMenuOption.js';\n\nexport interface StringSelectMenuData extends Partial<Omit<APIStringSelectComponent, 'options'>> {\n\toptions: StringSelectMenuOptionBuilder[];\n\trequired?: boolean;\n}\n\n/**\n * A builder that creates API-compatible JSON data for string select menus.\n */\nexport class StringSelectMenuBuilder extends BaseSelectMenuBuilder<APIStringSelectComponent> {\n\tprotected override readonly data: StringSelectMenuData;\n\n\t/**\n\t * The options for this select menu.\n\t */\n\tpublic get options(): readonly StringSelectMenuOptionBuilder[] {\n\t\treturn this.data.options;\n\t}\n\n\t/**\n\t * Creates a new string select menu.\n\t *\n\t * @param data - The API data to create this string select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new StringSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * \toptions: [\n\t * \t\t{ label: 'option 1', value: '1' },\n\t * \t\t{ label: 'option 2', value: '2' },\n\t * \t\t{ label: 'option 3', value: '3' },\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new StringSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1)\n\t * \t.addOptions({\n\t * \t\tlabel: 'Catchy',\n\t * \t\tvalue: 'catch',\n\t * \t});\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIStringSelectComponent> = {}) {\n\t\tsuper();\n\n\t\tconst { options = [], ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\toptions: options.map((option) => new StringSelectMenuOptionBuilder(option)),\n\t\t\ttype: ComponentType.StringSelect,\n\t\t};\n\t}\n\n\t/**\n\t * Adds options to this select menu.\n\t *\n\t * @param options - The options to add\n\t */\n\tpublic addOptions(\n\t\t...options: RestOrArray<\n\t\t\t| APISelectMenuOption\n\t\t\t| StringSelectMenuOptionBuilder\n\t\t\t| ((builder: StringSelectMenuOptionBuilder) => StringSelectMenuOptionBuilder)\n\t\t>\n\t) {\n\t\tconst normalizedOptions = normalizeArray(options);\n\t\tconst resolved = normalizedOptions.map((option) => resolveBuilder(option, StringSelectMenuOptionBuilder));\n\n\t\tthis.data.options.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the options for this select menu.\n\t *\n\t * @param options - The options to set\n\t */\n\tpublic setOptions(\n\t\t...options: RestOrArray<\n\t\t\t| APISelectMenuOption\n\t\t\t| StringSelectMenuOptionBuilder\n\t\t\t| ((builder: StringSelectMenuOptionBuilder) => StringSelectMenuOptionBuilder)\n\t\t>\n\t) {\n\t\treturn this.spliceOptions(0, this.options.length, ...normalizeArray(options));\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts options for this select menu.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | Array.prototype.splice()}.\n\t * It's useful for modifying and adjusting the order of existing options.\n\t * @example\n\t * Remove the first option:\n\t * ```ts\n\t * selectMenu.spliceOptions(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n option:\n\t * ```ts\n\t * const n = 4;\n\t * selectMenu.spliceOptions(0, n);\n\t * ```\n\t * @example\n\t * Remove the last option:\n\t * ```ts\n\t * selectMenu.spliceOptions(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of options to remove\n\t * @param options - The replacing option objects or builders\n\t */\n\tpublic spliceOptions(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...options: (\n\t\t\t| APISelectMenuOption\n\t\t\t| StringSelectMenuOptionBuilder\n\t\t\t| ((builder: StringSelectMenuOptionBuilder) => StringSelectMenuOptionBuilder)\n\t\t)[]\n\t) {\n\t\tconst resolved = options.map((option) => resolveBuilder(option, StringSelectMenuOptionBuilder));\n\n\t\tthis.data.options ??= [];\n\t\tthis.data.options.splice(index, deleteCount, ...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIStringSelectComponent {\n\t\tconst { options, ...rest } = this.data;\n\t\tconst data = {\n\t\t\t...(structuredClone(rest) as APIStringSelectComponent),\n\t\t\t// selectMenuStringPredicate covers the validation of options\n\t\t\toptions: options.map((option) => option.toJSON(false)),\n\t\t};\n\n\t\tvalidate(selectMenuStringPredicate, data, validationOverride);\n\n\t\treturn data as APIStringSelectComponent;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIMessageComponentEmoji, APISelectMenuOption } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { selectMenuStringOptionPredicate } from '../Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for string select menu options.\n */\nexport class StringSelectMenuOptionBuilder implements JSONEncodable<APISelectMenuOption> {\n\tprivate readonly data: Partial<APISelectMenuOption>;\n\n\t/**\n\t * Creates a new string select menu option.\n\t *\n\t * @param data - The API data to create this string select menu option with\n\t * @example\n\t * Creating a string select menu option from an API data object:\n\t * ```ts\n\t * const selectMenuOption = new SelectMenuOptionBuilder({\n\t * \tlabel: 'catchy label',\n\t * \tvalue: '1',\n\t * });\n\t * ```\n\t * @example\n\t * Creating a string select menu option using setters and API data:\n\t * ```ts\n\t * const selectMenuOption = new SelectMenuOptionBuilder({\n\t * \tdefault: true,\n\t * \tvalue: '1',\n\t * })\n\t * \t.setLabel('woah');\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APISelectMenuOption> = {}) {\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * Sets the label for this option.\n\t *\n\t * @param label - The label to use\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = label;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value for this option.\n\t *\n\t * @param value - The value to use\n\t */\n\tpublic setValue(value: string) {\n\t\tthis.data.value = value;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description for this option.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = description;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description for this option.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this option is selected by default.\n\t *\n\t * @param isDefault - Whether this option is selected by default\n\t */\n\tpublic setDefault(isDefault = true) {\n\t\tthis.data.default = isDefault;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the emoji to display for this option.\n\t *\n\t * @param emoji - The emoji to use\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\tthis.data.emoji = emoji;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the emoji for this option.\n\t */\n\tpublic clearEmoji() {\n\t\tthis.data.emoji = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(validationOverride?: boolean): APISelectMenuOption {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(selectMenuStringOptionPredicate, clone, validationOverride);\n\n\t\treturn clone as APISelectMenuOption;\n\t}\n}\n","import {\n\ttype APIUserSelectComponent,\n\ttype Snowflake,\n\tComponentType,\n\tSelectMenuDefaultValueType,\n} from 'discord-api-types/v10';\nimport { type RestOrArray, normalizeArray } from '../../util/normalizeArray.js';\nimport { validate } from '../../util/validation.js';\nimport { selectMenuUserPredicate } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\n/**\n * A builder that creates API-compatible JSON data for user select menus.\n */\nexport class UserSelectMenuBuilder extends BaseSelectMenuBuilder<APIUserSelectComponent> {\n\tprotected override readonly data: Partial<APIUserSelectComponent>;\n\n\t/**\n\t * Creates a new user select menu.\n\t *\n\t * @param data - The API data to create this user select menu with\n\t * @example\n\t * Creating a select menu from an API data object:\n\t * ```ts\n\t * const selectMenu = new UserSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data:\n\t * ```ts\n\t * const selectMenu = new UserSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIUserSelectComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.UserSelect };\n\t}\n\n\t/**\n\t * Adds default users to this auto populated select menu.\n\t *\n\t * @param users - The users to add\n\t */\n\tpublic addDefaultUsers(...users: RestOrArray<Snowflake>) {\n\t\tconst normalizedValues = normalizeArray(users);\n\n\t\tthis.data.default_values ??= [];\n\t\tthis.data.default_values.push(\n\t\t\t...normalizedValues.map((id) => ({\n\t\t\t\tid,\n\t\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t\t})),\n\t\t);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets default users for this auto populated select menu.\n\t *\n\t * @param users - The users to set\n\t */\n\tpublic setDefaultUsers(...users: RestOrArray<Snowflake>) {\n\t\tconst normalizedValues = normalizeArray(users);\n\n\t\tthis.data.default_values = normalizedValues.map((id) => ({\n\t\t\tid,\n\t\t\ttype: SelectMenuDefaultValueType.User as const,\n\t\t}));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIUserSelectComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(selectMenuUserPredicate, clone, validationOverride);\n\n\t\treturn clone as APIUserSelectComponent;\n\t}\n}\n","import { ComponentType, type TextInputStyle, type APITextInputComponent } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { textInputPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for text inputs.\n */\nexport class TextInputBuilder extends ComponentBuilder<APITextInputComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: Partial<APITextInputComponent>;\n\n\t/**\n\t * Creates a new text input.\n\t *\n\t * @param data - The API data to create this text input with\n\t * @example\n\t * Creating a text input from an API data object:\n\t * ```ts\n\t * const textInput = new TextInputBuilder({\n\t * \tcustom_id: 'a cool text input',\n\t * \tplaceholder: 'Type something',\n\t * \tstyle: TextInputStyle.Short,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a text input using setters and API data:\n\t * ```ts\n\t * const textInput = new TextInputBuilder({\n\t * \tplaceholder: 'Type something else',\n\t * })\n\t * \t.setCustomId('woah')\n\t * \t.setStyle(TextInputStyle.Paragraph);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APITextInputComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = { ...structuredClone(data), type: ComponentType.TextInput };\n\t}\n\n\t/**\n\t * Sets the custom id for this text input.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customId;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the style for this text input.\n\t *\n\t * @param style - The style to use\n\t */\n\tpublic setStyle(style: TextInputStyle) {\n\t\tthis.data.style = style;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum length of text for this text input.\n\t *\n\t * @param minLength - The minimum length of text for this text input\n\t */\n\tpublic setMinLength(minLength: number) {\n\t\tthis.data.min_length = minLength;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the minimum length of text for this text input.\n\t */\n\tpublic clearMinLength() {\n\t\tthis.data.min_length = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum length of text for this text input.\n\t *\n\t * @param maxLength - The maximum length of text for this text input\n\t */\n\tpublic setMaxLength(maxLength: number) {\n\t\tthis.data.max_length = maxLength;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the maximum length of text for this text input.\n\t */\n\tpublic clearMaxLength() {\n\t\tthis.data.max_length = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the placeholder for this text input.\n\t *\n\t * @param placeholder - The placeholder to use\n\t */\n\tpublic setPlaceholder(placeholder: string) {\n\t\tthis.data.placeholder = placeholder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the placeholder for this text input.\n\t */\n\tpublic clearPlaceholder() {\n\t\tthis.data.placeholder = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value for this text input.\n\t *\n\t * @param value - The value to use\n\t */\n\tpublic setValue(value: string) {\n\t\tthis.data.value = value;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the value for this text input.\n\t */\n\tpublic clearValue() {\n\t\tthis.data.value = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this text input is required.\n\t *\n\t * @param required - Whether this text input is required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = required;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(validationOverride?: boolean): APITextInputComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(textInputPredicate, clone, validationOverride);\n\n\t\treturn clone as APITextInputComponent;\n\t}\n}\n","import { ComponentType, TextInputStyle } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { customIdPredicate, idPredicate } from '../../Assertions.js';\n\nexport const textInputPredicate = z.object({\n\tid: idPredicate,\n\ttype: z.literal(ComponentType.TextInput),\n\tcustom_id: customIdPredicate,\n\tstyle: z.enum(TextInputStyle),\n\tmin_length: z.number().min(0).max(4_000).optional(),\n\tmax_length: z.number().min(1).max(4_000).optional(),\n\tplaceholder: z.string().max(100).optional(),\n\tvalue: z.string().min(0).max(4_000).optional(),\n\trequired: z.boolean().optional(),\n});\n","import {\n\ttype APIComponentInMessageActionRow,\n\ttype APISeparatorComponent,\n\ttype APIActionRowComponent,\n\ttype APIFileComponent,\n\ttype APITextDisplayComponent,\n\ttype APIContainerComponent,\n\ttype APIComponentInContainer,\n\ttype APIMediaGalleryComponent,\n\ttype APISectionComponent,\n\tComponentType,\n} from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray';\nimport { resolveBuilder } from '../../util/resolveBuilder';\nimport { validate } from '../../util/validation';\nimport { ActionRowBuilder } from '../ActionRow.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { createComponentBuilder } from '../Components';\nimport { containerPredicate } from './Assertions';\nimport { FileBuilder } from './File.js';\nimport { MediaGalleryBuilder } from './MediaGallery';\nimport { SectionBuilder } from './Section';\nimport { SeparatorBuilder } from './Separator.js';\nimport { TextDisplayBuilder } from './TextDisplay';\n\nexport type ContainerComponentBuilders =\n\t| ActionRowBuilder\n\t| FileBuilder\n\t| MediaGalleryBuilder\n\t| SectionBuilder\n\t| SeparatorBuilder\n\t| TextDisplayBuilder;\n\nexport interface ContainerBuilderData extends Partial<Omit<APIContainerComponent, 'components'>> {\n\tcomponents: ContainerComponentBuilders[];\n}\n\n/**\n * A builder that creates API-compatible JSON data for containers.\n */\nexport class ContainerBuilder extends ComponentBuilder<APIContainerComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: ContainerBuilderData;\n\n\t/**\n\t * Gets the components within this container.\n\t */\n\tpublic get components(): readonly ContainerComponentBuilders[] {\n\t\treturn this.data.components;\n\t}\n\n\t/**\n\t * Creates a new container builder.\n\t *\n\t * @param data - The API data to create the container with\n\t */\n\tpublic constructor(data: Partial<APIContainerComponent> = {}) {\n\t\tsuper();\n\n\t\tconst { components = [], ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tcomponents: components.map((component) => createComponentBuilder(component)),\n\t\t\ttype: ComponentType.Container,\n\t\t};\n\t}\n\n\t/**\n\t * Sets the accent color of this container.\n\t *\n\t * @param color - The color to use\n\t */\n\tpublic setAccentColor(color: number) {\n\t\tthis.data.accent_color = color;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the accent color of this container.\n\t */\n\tpublic clearAccentColor() {\n\t\tthis.data.accent_color = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this container.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoiler;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds action row components to this container.\n\t *\n\t * @param input - The action row to add\n\t */\n\tpublic addActionRowComponents(\n\t\t...input: RestOrArray<\n\t\t\t| ActionRowBuilder\n\t\t\t| APIActionRowComponent<APIComponentInMessageActionRow>\n\t\t\t| ((builder: ActionRowBuilder) => ActionRowBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, ActionRowBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds file components to this container.\n\t *\n\t * @param input - The file components to add\n\t */\n\tpublic addFileComponents(\n\t\t...input: RestOrArray<APIFileComponent | FileBuilder | ((builder: FileBuilder) => FileBuilder)>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, FileBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds media gallery components to this container.\n\t *\n\t * @param input - The media gallery components to add\n\t */\n\tpublic addMediaGalleryComponents(\n\t\t...input: RestOrArray<\n\t\t\tAPIMediaGalleryComponent | MediaGalleryBuilder | ((builder: MediaGalleryBuilder) => MediaGalleryBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, MediaGalleryBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds section components to this container.\n\t *\n\t * @param input - The section components to add\n\t */\n\tpublic addSectionComponents(\n\t\t...input: RestOrArray<APISectionComponent | SectionBuilder | ((builder: SectionBuilder) => SectionBuilder)>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, SectionBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds separator components to this container.\n\t *\n\t * @param input - The separator components to add\n\t */\n\tpublic addSeparatorComponents(\n\t\t...input: RestOrArray<APISeparatorComponent | SeparatorBuilder | ((builder: SeparatorBuilder) => SeparatorBuilder)>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, SeparatorBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds text display components to this container.\n\t *\n\t * @param input - The text display components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...input: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, TextDisplayBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts components for this container\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing components of a container.\n\t * @example\n\t * Remove the first component:\n\t * ```ts\n\t * container.spliceComponents(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n components:\n\t * ```ts\n\t * const n = 4;\n\t * container.spliceComponents(0, n);\n\t * ```\n\t * @example\n\t * Remove the last component:\n\t * ```ts\n\t * container.spliceComponents(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of components to remove\n\t * @param components - The replacing component objects\n\t */\n\tpublic spliceComponents(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...components: RestOrArray<APIComponentInContainer | ContainerComponentBuilders>\n\t): this {\n\t\tconst normalized = normalizeArray(components);\n\t\tconst resolved = normalized.map((component) =>\n\t\t\tcomponent instanceof ComponentBuilder ? component : createComponentBuilder(component),\n\t\t);\n\n\t\tthis.data.components.splice(index, deleteCount, ...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIContainerComponent {\n\t\tconst { components, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\tcomponents: components.map((component) => component.toJSON(false)),\n\t\t};\n\n\t\tvalidate(containerPredicate, data, validationOverride);\n\n\t\treturn data as APIContainerComponent;\n\t}\n}\n","import { ComponentType, SeparatorSpacingSize } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { idPredicate } from '../../Assertions.js';\nimport { actionRowPredicate } from '../Assertions.js';\n\nconst unfurledMediaItemPredicate = z.object({\n\turl: z.url({ protocol: /^(?:https?|attachment)$/ }),\n});\n\nexport const thumbnailPredicate = z.object({\n\ttype: z.literal(ComponentType.Thumbnail),\n\tid: idPredicate,\n\tmedia: unfurledMediaItemPredicate,\n\tdescription: z.string().min(1).max(1_024).nullish(),\n\tspoiler: z.boolean().optional(),\n});\n\nconst unfurledMediaItemAttachmentOnlyPredicate = z.object({\n\turl: z.url({ protocol: /^attachment$/ }),\n});\n\nexport const filePredicate = z.object({\n\ttype: z.literal(ComponentType.File),\n\tid: idPredicate,\n\tfile: unfurledMediaItemAttachmentOnlyPredicate,\n\tspoiler: z.boolean().optional(),\n});\n\nexport const separatorPredicate = z.object({\n\ttype: z.literal(ComponentType.Separator),\n\tid: idPredicate,\n\tdivider: z.boolean().optional(),\n\tspacing: z.enum(SeparatorSpacingSize).optional(),\n});\n\nexport const textDisplayPredicate = z.object({\n\ttype: z.literal(ComponentType.TextDisplay),\n\tid: idPredicate,\n\tcontent: z.string().min(1).max(4_000),\n});\n\nexport const mediaGalleryItemPredicate = z.object({\n\tid: idPredicate,\n\tmedia: unfurledMediaItemPredicate,\n\tdescription: z.string().min(1).max(1_024).nullish(),\n\tspoiler: z.boolean().optional(),\n});\n\nexport const mediaGalleryPredicate = z.object({\n\ttype: z.literal(ComponentType.MediaGallery),\n\tid: idPredicate,\n\titems: z.array(mediaGalleryItemPredicate).min(1).max(10),\n});\n\nexport const sectionPredicate = z.object({\n\ttype: z.literal(ComponentType.Section),\n\tid: idPredicate,\n\tcomponents: z.array(textDisplayPredicate).min(1).max(3),\n\taccessory: z.union([\n\t\tz.object({ type: z.literal(ComponentType.Button) }),\n\t\tz.object({ type: z.literal(ComponentType.Thumbnail) }),\n\t]),\n});\n\nexport const containerPredicate = z.object({\n\ttype: z.literal(ComponentType.Container),\n\tid: idPredicate,\n\tcomponents: z\n\t\t.array(\n\t\t\tz.union([\n\t\t\t\tactionRowPredicate,\n\t\t\t\tfilePredicate,\n\t\t\t\tmediaGalleryPredicate,\n\t\t\t\tsectionPredicate,\n\t\t\t\tseparatorPredicate,\n\t\t\t\ttextDisplayPredicate,\n\t\t\t]),\n\t\t)\n\t\t.min(1),\n\tspoiler: z.boolean().optional(),\n\taccent_color: z.int().min(0).max(0xffffff).nullish(),\n});\n","import { ComponentType, type APIFileComponent } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { filePredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for files.\n */\nexport class FileBuilder extends ComponentBuilder<APIFileComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: Partial<APIFileComponent>;\n\n\t/**\n\t * Creates a new file.\n\t *\n\t * @param data - The API data to create this file with\n\t * @example\n\t * Creating a file from an API data object:\n\t * ```ts\n\t * const file = new FileBuilder({\n\t * \tspoiler: true,\n\t * \tfile: {\n\t * \t\turl: 'attachment://file.png',\n\t * \t},\n\t * });\n\t * ```\n\t * @example\n\t * Creating a file using setters and API data:\n\t * ```ts\n\t * const file = new FileBuilder({\n\t * \tfile: {\n\t * \t\turl: 'attachment://image.jpg',\n\t * \t},\n\t * })\n\t * \t.setSpoiler(false);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIFileComponent> = {}) {\n\t\tsuper();\n\n\t\tconst { file, ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tfile: file && { url: file.url },\n\t\t\ttype: ComponentType.File,\n\t\t};\n\t}\n\n\t/**\n\t * Sets the spoiler status of this file.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoiler;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the media URL of this file.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.file = { url };\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIFileComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(filePredicate, clone, validationOverride);\n\n\t\treturn clone as APIFileComponent;\n\t}\n}\n","import { type APIMediaGalleryItem, type APIMediaGalleryComponent, ComponentType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../util/resolveBuilder.js';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { mediaGalleryPredicate } from './Assertions.js';\nimport { MediaGalleryItemBuilder } from './MediaGalleryItem.js';\n\nexport interface MediaGalleryBuilderData extends Partial<Omit<APIMediaGalleryComponent, 'items'>> {\n\titems: MediaGalleryItemBuilder[];\n}\n\n/**\n * A builder that creates API-compatible JSON data for media galleries.\n */\nexport class MediaGalleryBuilder extends ComponentBuilder<APIMediaGalleryComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: MediaGalleryBuilderData;\n\n\t/**\n\t * The items in this media gallery.\n\t */\n\tpublic get items(): readonly MediaGalleryItemBuilder[] {\n\t\treturn this.data.items;\n\t}\n\n\t/**\n\t * Creates a new media gallery.\n\t *\n\t * @param data - The API data to create this container with\n\t * @example\n\t * Creating a media gallery from an API data object:\n\t * ```ts\n\t * const mediaGallery = new MediaGalleryBuilder({\n\t * \titems: [\n\t * \t\t{\n\t * \t\t\tdescription: \"Some text here\",\n\t * \t\t\tmedia: {\n\t * \t\t\t\turl: 'https://cdn.discordapp.com/embed/avatars/2.png',\n\t * \t\t\t},\n\t * \t\t},\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating a media gallery using setters and API data:\n\t * ```ts\n\t * const mediaGallery = new MediaGalleryBuilder({\n\t * \titems: [\n\t * \t\t{\n\t * \t\t\tdescription: \"alt text\",\n\t * \t\t\tmedia: {\n\t * \t\t\t\turl: 'https://cdn.discordapp.com/embed/avatars/5.png',\n\t * \t\t\t},\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.addItems(item2, item3);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIMediaGalleryComponent> = {}) {\n\t\tsuper();\n\n\t\tconst { items = [], ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\titems: items.map((item) => new MediaGalleryItemBuilder(item)),\n\t\t\ttype: ComponentType.MediaGallery,\n\t\t};\n\t}\n\n\t/**\n\t * Adds a media gallery item to this media gallery.\n\t *\n\t * @param input - The items to add\n\t */\n\tpublic addItems(\n\t\t...input: RestOrArray<\n\t\t\tAPIMediaGalleryItem | MediaGalleryItemBuilder | ((builder: MediaGalleryItemBuilder) => MediaGalleryItemBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((item) => resolveBuilder(item, MediaGalleryItemBuilder));\n\n\t\tthis.data.items.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts media gallery items for this media gallery.\n\t *\n\t * @param index - The index to start removing, replacing or inserting items\n\t * @param deleteCount - The amount of items to remove\n\t * @param items - The items to insert\n\t */\n\tpublic spliceItems(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...items: RestOrArray<\n\t\t\tAPIMediaGalleryItem | MediaGalleryItemBuilder | ((builder: MediaGalleryItemBuilder) => MediaGalleryItemBuilder)\n\t\t>\n\t) {\n\t\tconst normalized = normalizeArray(items);\n\t\tconst resolved = normalized.map((item) => resolveBuilder(item, MediaGalleryItemBuilder));\n\n\t\tthis.data.items.splice(index, deleteCount, ...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIMediaGalleryComponent {\n\t\tconst { items, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\titems: items.map((item) => item.toJSON(false)),\n\t\t};\n\n\t\tvalidate(mediaGalleryPredicate, data, validationOverride);\n\n\t\treturn data as APIMediaGalleryComponent;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIMediaGalleryItem } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { mediaGalleryItemPredicate } from './Assertions.js';\n\nexport class MediaGalleryItemBuilder implements JSONEncodable<APIMediaGalleryItem> {\n\tprivate readonly data: Partial<APIMediaGalleryItem>;\n\n\t/**\n\t * Creates a new media gallery item.\n\t *\n\t * @param data - The API data to create this media gallery item with\n\t * @example\n\t * Creating a media gallery item from an API data object:\n\t * ```ts\n\t * const item = new MediaGalleryItemBuilder({\n\t * \tdescription: \"Some text here\",\n\t * \tmedia: {\n\t * \t\turl: 'https://cdn.discordapp.com/embed/avatars/2.png',\n\t * \t},\n\t * });\n\t * ```\n\t * @example\n\t * Creating a media gallery item using setters and API data:\n\t * ```ts\n\t * const item = new MediaGalleryItemBuilder({\n\t * \tmedia: {\n\t * \t\turl: 'https://cdn.discordapp.com/embed/avatars/5.png',\n\t * \t},\n\t * })\n\t * \t.setDescription(\"alt text\");\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIMediaGalleryItem> = {}) {\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * Sets the source URL of this media gallery item.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.media = { url };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this thumbnail.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = description;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description of this thumbnail.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this thumbnail.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoiler;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Transforms this object to its JSON format\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIMediaGalleryItem {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(mediaGalleryItemPredicate, clone, validationOverride);\n\n\t\treturn clone as APIMediaGalleryItem;\n\t}\n}\n","import type {\n\tAPITextDisplayComponent,\n\tAPISectionComponent,\n\tAPIButtonComponentWithCustomId,\n\tAPIThumbnailComponent,\n\tAPIButtonComponentWithSKUId,\n\tAPIButtonComponentWithURL,\n\tButtonStyle,\n} from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../util/resolveBuilder.js';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { resolveAccessoryComponent, type ButtonBuilder } from '../Components.js';\nimport {\n\tDangerButtonBuilder,\n\tPrimaryButtonBuilder,\n\tSecondaryButtonBuilder,\n\tSuccessButtonBuilder,\n} from '../button/CustomIdButton.js';\nimport { LinkButtonBuilder } from '../button/LinkButton.js';\nimport { PremiumButtonBuilder } from '../button/PremiumButton.js';\nimport { sectionPredicate } from './Assertions.js';\nimport { TextDisplayBuilder } from './TextDisplay.js';\nimport { ThumbnailBuilder } from './Thumbnail.js';\n\nexport type SectionBuilderAccessory = ButtonBuilder | ThumbnailBuilder;\n\nexport interface SectionBuilderData extends Partial<Omit<APISectionComponent, 'accessory' | 'components'>> {\n\taccessory?: SectionBuilderAccessory;\n\tcomponents: TextDisplayBuilder[];\n}\n\n/**\n * A builder that creates API-compatible JSON data for sections.\n */\nexport class SectionBuilder extends ComponentBuilder<APISectionComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: SectionBuilderData;\n\n\t/**\n\t * The components within this section.\n\t */\n\tpublic get components(): readonly TextDisplayBuilder[] {\n\t\treturn this.data.components;\n\t}\n\n\t/**\n\t * Creates a new section.\n\t *\n\t * @param data - The API data to create this section with\n\t * @example\n\t * Creating a section from an API data object:\n\t * ```ts\n\t * const section = new SectionBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"Some text here\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * accessory: {\n\t * media: {\n\t * url: 'https://cdn.discordapp.com/embed/avatars/3.png',\n\t * },\n\t * }\n\t * });\n\t * ```\n\t * @example\n\t * Creating a section using setters and API data:\n\t * ```ts\n\t * const section = new SectionBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcontent: \"# Heading\",\n\t * \t\t\ttype: ComponentType.TextDisplay,\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.setPrimaryButtonAccessory(button);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APISectionComponent> = {}) {\n\t\tsuper();\n\n\t\tconst { components = [], accessory, ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\taccessory: accessory && resolveAccessoryComponent(accessory),\n\t\t\tcomponents: components.map((component) => new TextDisplayBuilder(component)),\n\t\t\ttype: ComponentType.Section,\n\t\t};\n\t}\n\n\t/**\n\t * Adds text display components to this section.\n\t *\n\t * @param input - The text display components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...input: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, TextDisplayBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a primary button component to be the accessory of this section.\n\t *\n\t * @param input - The button to set as the accessory\n\t */\n\tpublic setPrimaryButtonAccessory(\n\t\tinput:\n\t\t\t| PrimaryButtonBuilder\n\t\t\t| ((builder: PrimaryButtonBuilder) => PrimaryButtonBuilder)\n\t\t\t| (APIButtonComponentWithCustomId & { style: ButtonStyle.Primary }),\n\t): this {\n\t\tconst builder = resolveBuilder(input, PrimaryButtonBuilder);\n\n\t\tthis.data.accessory = builder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a secondary button component to be the accessory of this section.\n\t *\n\t * @param input - The button to set as the accessory\n\t */\n\tpublic setSecondaryButtonAccessory(\n\t\tinput:\n\t\t\t| SecondaryButtonBuilder\n\t\t\t| ((builder: SecondaryButtonBuilder) => SecondaryButtonBuilder)\n\t\t\t| (APIButtonComponentWithCustomId & { style: ButtonStyle.Secondary }),\n\t): this {\n\t\tconst builder = resolveBuilder(input, SecondaryButtonBuilder);\n\n\t\tthis.data.accessory = builder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a success button component to be the accessory of this section.\n\t *\n\t * @param input - The button to set as the accessory\n\t */\n\tpublic setSuccessButtonAccessory(\n\t\tinput:\n\t\t\t| SuccessButtonBuilder\n\t\t\t| ((builder: SuccessButtonBuilder) => SuccessButtonBuilder)\n\t\t\t| (APIButtonComponentWithCustomId & { style: ButtonStyle.Success }),\n\t): this {\n\t\tconst builder = resolveBuilder(input, SuccessButtonBuilder);\n\n\t\tthis.data.accessory = builder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a danger button component to be the accessory of this section.\n\t *\n\t * @param input - The button to set as the accessory\n\t */\n\tpublic setDangerButtonAccessory(\n\t\tinput:\n\t\t\t| DangerButtonBuilder\n\t\t\t| ((builder: DangerButtonBuilder) => DangerButtonBuilder)\n\t\t\t| (APIButtonComponentWithCustomId & { style: ButtonStyle.Danger }),\n\t): this {\n\t\tconst builder = resolveBuilder(input, DangerButtonBuilder);\n\n\t\tthis.data.accessory = builder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a SKU id button component to be the accessory of this section.\n\t *\n\t * @param input - The button to set as the accessory\n\t */\n\tpublic setPremiumButtonAccessory(\n\t\tinput:\n\t\t\t| APIButtonComponentWithSKUId\n\t\t\t| PremiumButtonBuilder\n\t\t\t| ((builder: PremiumButtonBuilder) => PremiumButtonBuilder),\n\t): this {\n\t\tconst builder = resolveBuilder(input, PremiumButtonBuilder);\n\n\t\tthis.data.accessory = builder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a URL button component to be the accessory of this section.\n\t *\n\t * @param input - The button to set as the accessory\n\t */\n\tpublic setLinkButtonAccessory(\n\t\tinput: APIButtonComponentWithURL | LinkButtonBuilder | ((builder: LinkButtonBuilder) => LinkButtonBuilder),\n\t): this {\n\t\tconst builder = resolveBuilder(input, LinkButtonBuilder);\n\n\t\tthis.data.accessory = builder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a thumbnail component to be the accessory of this section.\n\t *\n\t * @param input - The thumbnail to set as the accessory\n\t */\n\tpublic setThumbnailAccessory(\n\t\tinput: APIThumbnailComponent | ThumbnailBuilder | ((builder: ThumbnailBuilder) => ThumbnailBuilder),\n\t): this {\n\t\tconst builder = resolveBuilder(input, ThumbnailBuilder);\n\n\t\tthis.data.accessory = builder;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts text display components for this section.\n\t *\n\t * @param index - The index to start removing, replacing or inserting text display components\n\t * @param deleteCount - The amount of text display components to remove\n\t * @param components - The text display components to insert\n\t */\n\tpublic spliceTextDisplayComponents(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...components: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(components);\n\t\tconst resolved = normalized.map((component) => resolveBuilder(component, TextDisplayBuilder));\n\n\t\tthis.data.components.splice(index, deleteCount, ...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APISectionComponent {\n\t\tconst { components, accessory, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\tcomponents: components.map((component) => component.toJSON(false)),\n\t\t\taccessory: accessory?.toJSON(validationOverride),\n\t\t};\n\n\t\tvalidate(sectionPredicate, data, validationOverride);\n\n\t\treturn data as APISectionComponent;\n\t}\n}\n","import type { APITextDisplayComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { textDisplayPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for text displays.\n */\nexport class TextDisplayBuilder extends ComponentBuilder<APITextDisplayComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: Partial<APITextDisplayComponent>;\n\n\t/**\n\t * Creates a new text display.\n\t *\n\t * @param data - The API data to create this text display with\n\t * @example\n\t * Creating a text display from an API data object:\n\t * ```ts\n\t * const textDisplay = new TextDisplayBuilder({\n\t * \tcontent: 'some text',\n\t * });\n\t * ```\n\t * @example\n\t * Creating a text display using setters and API data:\n\t * ```ts\n\t * const textDisplay = new TextDisplayBuilder({\n\t * \tcontent: 'old text',\n\t * })\n\t * \t.setContent('new text');\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APITextDisplayComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = {\n\t\t\t...structuredClone(data),\n\t\t\ttype: ComponentType.TextDisplay,\n\t\t};\n\t}\n\n\t/**\n\t * Sets the text of this text display.\n\t *\n\t * @param content - The text to use\n\t */\n\tpublic setContent(content: string) {\n\t\tthis.data.content = content;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APITextDisplayComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(textDisplayPredicate, clone, validationOverride);\n\n\t\treturn clone as APITextDisplayComponent;\n\t}\n}\n","import type { APIThumbnailComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { thumbnailPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for thumbnails.\n */\nexport class ThumbnailBuilder extends ComponentBuilder<APIThumbnailComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: Partial<APIThumbnailComponent>;\n\n\t/**\n\t * Creates a new thumbnail.\n\t *\n\t * @param data - The API data to create this thumbnail with\n\t * @example\n\t * Creating a thumbnail from an API data object:\n\t * ```ts\n\t * const thumbnail = new ThumbnailBuilder({\n\t * \tdescription: 'some text',\n\t * media: {\n\t * url: 'https://cdn.discordapp.com/embed/avatars/4.png',\n\t * },\n\t * });\n\t * ```\n\t * @example\n\t * Creating a thumbnail using setters and API data:\n\t * ```ts\n\t * const thumbnail = new ThumbnailBuilder({\n\t * \tmedia: {\n\t * url: 'attachment://image.png',\n\t * },\n\t * })\n\t * \t.setDescription('alt text');\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APIThumbnailComponent> = {}) {\n\t\tsuper();\n\n\t\tconst { media, ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tmedia: media && { url: media.url },\n\t\t\ttype: ComponentType.Thumbnail,\n\t\t};\n\t}\n\n\t/**\n\t * Sets the description of this thumbnail.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = description;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description of this thumbnail.\n\t */\n\tpublic clearDescription() {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spoiler status of this thumbnail.\n\t *\n\t * @param spoiler - The spoiler status to use\n\t */\n\tpublic setSpoiler(spoiler = true) {\n\t\tthis.data.spoiler = spoiler;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the media URL of this thumbnail.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string) {\n\t\tthis.data.media = { url };\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritdoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIThumbnailComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(thumbnailPredicate, clone, validationOverride);\n\n\t\treturn clone as APIThumbnailComponent;\n\t}\n}\n","import type { SeparatorSpacingSize, APISeparatorComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { ComponentBuilder } from '../Component.js';\nimport { separatorPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for separators.\n */\nexport class SeparatorBuilder extends ComponentBuilder<APISeparatorComponent> {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: Partial<APISeparatorComponent>;\n\n\t/**\n\t * Creates a new separator.\n\t *\n\t * @param data - The API data to create this separator with\n\t * @example\n\t * Creating a separator from an API data object:\n\t * ```ts\n\t * const separator = new SeparatorBuilder({\n\t * \tspacing: SeparatorSpacingSize.Small,\n\t * divider: true,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a separator using setters and API data:\n\t * ```ts\n\t * const separator = new SeparatorBuilder({\n\t * \tspacing: SeparatorSpacingSize.Large,\n\t * })\n\t * \t.setDivider(false);\n\t * ```\n\t */\n\tpublic constructor(data: Partial<APISeparatorComponent> = {}) {\n\t\tsuper();\n\t\tthis.data = {\n\t\t\t...structuredClone(data),\n\t\t\ttype: ComponentType.Separator,\n\t\t};\n\t}\n\n\t/**\n\t * Sets whether this separator should show a divider line.\n\t *\n\t * @param divider - Whether to show a divider line\n\t */\n\tpublic setDivider(divider = true) {\n\t\tthis.data.divider = divider;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the spacing of this separator.\n\t *\n\t * @param spacing - The spacing to use\n\t */\n\tpublic setSpacing(spacing: SeparatorSpacingSize) {\n\t\tthis.data.spacing = spacing;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the spacing of this separator.\n\t */\n\tpublic clearSpacing() {\n\t\tthis.data.spacing = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APISeparatorComponent {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(separatorPredicate, clone, validationOverride);\n\n\t\treturn clone as APISeparatorComponent;\n\t}\n}\n","import { ComponentType } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { idPredicate } from '../../Assertions';\nimport {\n\tselectMenuChannelPredicate,\n\tselectMenuMentionablePredicate,\n\tselectMenuRolePredicate,\n\tselectMenuStringPredicate,\n\tselectMenuUserPredicate,\n} from '../Assertions';\nimport { fileUploadPredicate } from '../fileUpload/Assertions';\nimport { textInputPredicate } from '../textInput/Assertions';\n\nexport const labelPredicate = z.object({\n\tid: idPredicate,\n\ttype: z.literal(ComponentType.Label),\n\tlabel: z.string().min(1).max(45),\n\tdescription: z.string().min(1).max(100).optional(),\n\tcomponent: z.union([\n\t\tselectMenuStringPredicate,\n\t\ttextInputPredicate,\n\t\tselectMenuUserPredicate,\n\t\tselectMenuRolePredicate,\n\t\tselectMenuMentionablePredicate,\n\t\tselectMenuChannelPredicate,\n\t\tfileUploadPredicate,\n\t]),\n});\n","import type { APIApplicationCommandIntegerOption } from 'discord-api-types/v10';\n\nexport interface ApplicationCommandNumericOptionMinMaxValueData extends Pick<\n\tAPIApplicationCommandIntegerOption,\n\t'max_value' | 'min_value'\n> {}\n\n/**\n * This mixin holds minimum and maximum symbols used for options.\n */\nexport abstract class ApplicationCommandNumericOptionMinMaxValueMixin {\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: ApplicationCommandNumericOptionMinMaxValueData;\n\n\t/**\n\t * Sets the maximum number value of this option.\n\t *\n\t * @param max - The maximum value this option can be\n\t */\n\tpublic setMaxValue(max: number): this {\n\t\tthis.data.max_value = max;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes the maximum number value of this option.\n\t */\n\tpublic clearMaxValue(): this {\n\t\tthis.data.max_value = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum number value of this option.\n\t *\n\t * @param min - The minimum value this option can be\n\t */\n\tpublic setMinValue(min: number): this {\n\t\tthis.data.min_value = min;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes the minimum number value of this option.\n\t */\n\tpublic clearMinValue(): this {\n\t\tthis.data.min_value = undefined;\n\t\treturn this;\n\t}\n}\n","import { ChannelType, type APIApplicationCommandChannelOption } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../../../util/normalizeArray';\n\nexport const ApplicationCommandOptionAllowedChannelTypes = [\n\tChannelType.GuildText,\n\tChannelType.GuildVoice,\n\tChannelType.GuildCategory,\n\tChannelType.GuildAnnouncement,\n\tChannelType.AnnouncementThread,\n\tChannelType.PublicThread,\n\tChannelType.PrivateThread,\n\tChannelType.GuildStageVoice,\n\tChannelType.GuildForum,\n\tChannelType.GuildMedia,\n] as const;\n\n/**\n * Allowed channel types used for a channel option.\n */\nexport type ApplicationCommandOptionAllowedChannelType = (typeof ApplicationCommandOptionAllowedChannelTypes)[number];\n\nexport interface ApplicationCommandOptionChannelTypesData extends Pick<\n\tAPIApplicationCommandChannelOption,\n\t'channel_types'\n> {}\n\n/**\n * This mixin holds channel type symbols used for options.\n */\nexport class ApplicationCommandOptionChannelTypesMixin {\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: ApplicationCommandOptionChannelTypesData;\n\n\t/**\n\t * Adds channel types to this option.\n\t *\n\t * @param channelTypes - The channel types\n\t */\n\tpublic addChannelTypes(...channelTypes: RestOrArray<ApplicationCommandOptionAllowedChannelType>) {\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.push(...normalizeArray(channelTypes));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the channel types for this option.\n\t *\n\t * @param channelTypes - The channel types\n\t */\n\tpublic setChannelTypes(...channelTypes: RestOrArray<ApplicationCommandOptionAllowedChannelType>) {\n\t\tthis.data.channel_types = normalizeArray(channelTypes);\n\t\treturn this;\n\t}\n}\n","import type {\n\tAPIApplicationCommandIntegerOption,\n\tAPIApplicationCommandNumberOption,\n\tAPIApplicationCommandStringOption,\n} from 'discord-api-types/v10';\n\nexport type AutocompletableOptions =\n\t| APIApplicationCommandIntegerOption\n\t| APIApplicationCommandNumberOption\n\t| APIApplicationCommandStringOption;\n\nexport interface ApplicationCommandOptionWithAutocompleteData extends Pick<AutocompletableOptions, 'autocomplete'> {}\n\n/**\n * This mixin holds choices and autocomplete symbols used for options.\n */\nexport class ApplicationCommandOptionWithAutocompleteMixin {\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: ApplicationCommandOptionWithAutocompleteData;\n\n\t/**\n\t * Whether this option uses autocomplete.\n\t *\n\t * @param autocomplete - Whether this option should use autocomplete\n\t */\n\tpublic setAutocomplete(autocomplete = true): this {\n\t\tthis.data.autocomplete = autocomplete;\n\t\treturn this;\n\t}\n}\n","import type { APIApplicationCommandOptionChoice } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../../../util/normalizeArray.js';\n\n// Unlike other places, we're not `Pick`ing from discord-api-types. The union includes `[]` and it breaks everything.\nexport interface ApplicationCommandOptionWithChoicesData {\n\tchoices?: APIApplicationCommandOptionChoice<number | string>[];\n}\n\n/**\n * This mixin holds choices and autocomplete symbols used for options.\n *\n * @typeParam ChoiceType - The type of the choices within this option\n */\nexport class ApplicationCommandOptionWithChoicesMixin<ChoiceType extends number | string> {\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: ApplicationCommandOptionWithChoicesData;\n\n\t/**\n\t * Adds multiple choices to this option.\n\t *\n\t * @param choices - The choices to add\n\t */\n\tpublic addChoices(...choices: RestOrArray<APIApplicationCommandOptionChoice<ChoiceType>>): this {\n\t\tconst normalizedChoices = normalizeArray(choices);\n\n\t\tthis.data.choices ??= [];\n\t\tthis.data.choices.push(...normalizedChoices);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets multiple choices for this option.\n\t *\n\t * @param choices - The choices to set\n\t */\n\tpublic setChoices(...choices: RestOrArray<APIApplicationCommandOptionChoice<ChoiceType>>): this {\n\t\tthis.data.choices = normalizeArray(choices);\n\t\treturn this;\n\t}\n}\n","import { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command attachment option.\n */\nexport class ChatInputCommandAttachmentOption extends ApplicationCommandOptionBase {\n\t/**\n\t * Creates a new attachment option.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Attachment);\n\t}\n}\n","import type { Locale, RESTPostAPIApplicationCommandsJSONBody } from 'discord-api-types/v10';\n\nexport interface SharedNameData extends Partial<\n\tPick<RESTPostAPIApplicationCommandsJSONBody, 'name_localizations' | 'name'>\n> {}\n\n/**\n * This mixin holds name and description symbols for chat input commands.\n */\nexport class SharedName {\n\t/**\n\t * @internal\n\t */\n\tprotected readonly data: SharedNameData = {};\n\n\t/**\n\t * Sets the name of this command.\n\t *\n\t * @param name - The name to use\n\t */\n\tpublic setName(name: string): this {\n\t\tthis.data.name = name;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a name localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedName - The localized name for the given `locale`\n\t */\n\tpublic setNameLocalization(locale: Locale, localizedName: string) {\n\t\tthis.data.name_localizations ??= {};\n\t\tthis.data.name_localizations[locale] = localizedName;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears a name localization for this command.\n\t *\n\t * @param locale - The locale to clear\n\t */\n\tpublic clearNameLocalization(locale: Locale) {\n\t\tthis.data.name_localizations ??= {};\n\t\tthis.data.name_localizations[locale] = undefined;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name localizations for this command.\n\t *\n\t * @param localizedNames - The object of localized names to set\n\t */\n\tpublic setNameLocalizations(localizedNames: Partial<Record<Locale, string>>) {\n\t\tthis.data.name_localizations = structuredClone(localizedNames);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears all name localizations for this command.\n\t */\n\tpublic clearNameLocalizations() {\n\t\tthis.data.name_localizations = undefined;\n\t\treturn this;\n\t}\n}\n","import type { APIApplicationCommand, Locale } from 'discord-api-types/v10';\nimport type { SharedNameData } from './SharedName.js';\nimport { SharedName } from './SharedName.js';\n\nexport interface SharedNameAndDescriptionData\n\textends SharedNameData, Partial<Pick<APIApplicationCommand, 'description_localizations' | 'description'>> {}\n\n/**\n * This mixin holds name and description symbols for chat input commands.\n */\nexport class SharedNameAndDescription extends SharedName {\n\t/**\n\t * @internal\n\t */\n\tprotected override readonly data: SharedNameAndDescriptionData = {};\n\n\t/**\n\t * Sets the description of this command.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = description;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a description localization for this command.\n\t *\n\t * @param locale - The locale to set\n\t * @param localizedDescription - The localized description for the given `locale`\n\t */\n\tpublic setDescriptionLocalization(locale: Locale, localizedDescription: string) {\n\t\tthis.data.description_localizations ??= {};\n\t\tthis.data.description_localizations[locale] = localizedDescription;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears a description localization for this command.\n\t *\n\t * @param locale - The locale to clear\n\t */\n\tpublic clearDescriptionLocalization(locale: Locale) {\n\t\tthis.data.description_localizations ??= {};\n\t\tthis.data.description_localizations[locale] = undefined;\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description localizations for this command.\n\t *\n\t * @param localizedDescriptions - The object of localized descriptions to set\n\t */\n\tpublic setDescriptionLocalizations(localizedDescriptions: Partial<Record<Locale, string>>) {\n\t\tthis.data.description_localizations = structuredClone(localizedDescriptions);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears all description localizations for this command.\n\t */\n\tpublic clearDescriptionLocalizations() {\n\t\tthis.data.description_localizations = undefined;\n\t\treturn this;\n\t}\n}\n","import {\n\tApplicationIntegrationType,\n\tInteractionContextType,\n\tApplicationCommandOptionType,\n} from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { localeMapPredicate, memberPermissionsPredicate } from '../../../Assertions.js';\nimport { ApplicationCommandOptionAllowedChannelTypes } from './mixins/ApplicationCommandOptionChannelTypesMixin.js';\n\nconst namePredicate = z\n\t.string()\n\t.min(1)\n\t.max(32)\n\t.regex(/^[\\p{Ll}\\p{Lm}\\p{Lo}\\p{N}\\p{sc=Devanagari}\\p{sc=Thai}_-]+$/u);\n\nconst descriptionPredicate = z.string().min(1).max(100);\n\nconst sharedNameAndDescriptionPredicate = z.object({\n\tname: namePredicate,\n\tname_localizations: localeMapPredicate.optional(),\n\tdescription: descriptionPredicate,\n\tdescription_localizations: localeMapPredicate.optional(),\n});\n\nconst numericMixinNumberOptionPredicate = z.object({\n\tmax_value: z.float32().optional(),\n\tmin_value: z.float32().optional(),\n});\n\nconst numericMixinIntegerOptionPredicate = z.object({\n\tmax_value: z.int().optional(),\n\tmin_value: z.int().optional(),\n});\n\nconst channelMixinOptionPredicate = z.object({\n\tchannel_types: z.literal(ApplicationCommandOptionAllowedChannelTypes).array().optional(),\n});\n\nconst autocompleteMixinOptionPredicate = z.object({\n\tautocomplete: z.literal(true),\n\tchoices: z.union([z.never(), z.never().array(), z.undefined()]),\n});\n\nconst choiceValueStringPredicate = z.string().min(1).max(100);\nconst choiceValueNumberPredicate = z.number();\nconst choiceBasePredicate = z.object({\n\tname: choiceValueStringPredicate,\n\tname_localizations: localeMapPredicate.optional(),\n});\nconst choiceStringPredicate = choiceBasePredicate.extend({\n\tvalue: choiceValueStringPredicate,\n});\nconst choiceNumberPredicate = choiceBasePredicate.extend({\n\tvalue: choiceValueNumberPredicate,\n});\n\nconst choiceBaseMixinPredicate = z.object({\n\tautocomplete: z.literal(false).optional(),\n});\nconst choiceStringMixinPredicate = choiceBaseMixinPredicate.extend({\n\tchoices: choiceStringPredicate.array().max(25).optional(),\n});\nconst choiceNumberMixinPredicate = choiceBaseMixinPredicate.extend({\n\tchoices: choiceNumberPredicate.array().max(25).optional(),\n});\n\nconst basicOptionTypesPredicate = z.literal([\n\tApplicationCommandOptionType.Attachment,\n\tApplicationCommandOptionType.Boolean,\n\tApplicationCommandOptionType.Channel,\n\tApplicationCommandOptionType.Integer,\n\tApplicationCommandOptionType.Mentionable,\n\tApplicationCommandOptionType.Number,\n\tApplicationCommandOptionType.Role,\n\tApplicationCommandOptionType.String,\n\tApplicationCommandOptionType.User,\n]);\n\nexport const basicOptionPredicate = sharedNameAndDescriptionPredicate.extend({\n\trequired: z.boolean().optional(),\n\ttype: basicOptionTypesPredicate,\n});\n\nconst autocompleteOrStringChoicesMixinOptionPredicate = z.discriminatedUnion('autocomplete', [\n\tautocompleteMixinOptionPredicate,\n\tchoiceStringMixinPredicate,\n]);\n\nconst autocompleteOrNumberChoicesMixinOptionPredicate = z.discriminatedUnion('autocomplete', [\n\tautocompleteMixinOptionPredicate,\n\tchoiceNumberMixinPredicate,\n]);\n\nexport const channelOptionPredicate = z.object({\n\t...basicOptionPredicate.shape,\n\t...channelMixinOptionPredicate.shape,\n});\n\nexport const integerOptionPredicate = z\n\t.object({\n\t\t...basicOptionPredicate.shape,\n\t\t...numericMixinIntegerOptionPredicate.shape,\n\t})\n\t.and(autocompleteOrNumberChoicesMixinOptionPredicate);\n\nexport const numberOptionPredicate = z\n\t.object({\n\t\t...basicOptionPredicate.shape,\n\t\t...numericMixinNumberOptionPredicate.shape,\n\t})\n\t.and(autocompleteOrNumberChoicesMixinOptionPredicate);\n\nexport const stringOptionPredicate = basicOptionPredicate\n\t.extend({\n\t\tmax_length: z.number().min(1).max(6_000).optional(),\n\t\tmin_length: z.number().min(0).max(6_000).optional(),\n\t})\n\t.and(autocompleteOrStringChoicesMixinOptionPredicate);\n\nconst baseChatInputCommandPredicate = sharedNameAndDescriptionPredicate.extend({\n\tcontexts: z.array(z.enum(InteractionContextType)).optional(),\n\tdefault_member_permissions: memberPermissionsPredicate.optional(),\n\tintegration_types: z.array(z.enum(ApplicationIntegrationType)).optional(),\n\tnsfw: z.boolean().optional(),\n});\n\n// Because you can only add options via builders, there's no need to validate whole objects here otherwise\nconst chatInputCommandOptionsPredicate = z.union([\n\tz.object({ type: basicOptionTypesPredicate }).array(),\n\tz\n\t\t.object({\n\t\t\ttype: z.union([\n\t\t\t\tz.literal(ApplicationCommandOptionType.Subcommand),\n\t\t\t\tz.literal(ApplicationCommandOptionType.SubcommandGroup),\n\t\t\t]),\n\t\t})\n\t\t.array(),\n]);\n\nexport const chatInputCommandPredicate = baseChatInputCommandPredicate.extend({\n\toptions: chatInputCommandOptionsPredicate.optional(),\n});\n\nexport const chatInputCommandSubcommandGroupPredicate = sharedNameAndDescriptionPredicate.extend({\n\ttype: z.literal(ApplicationCommandOptionType.SubcommandGroup),\n\toptions: z\n\t\t.array(z.object({ type: z.literal(ApplicationCommandOptionType.Subcommand) }))\n\t\t.min(1)\n\t\t.max(25),\n});\n\nexport const chatInputCommandSubcommandPredicate = sharedNameAndDescriptionPredicate.extend({\n\ttype: z.literal(ApplicationCommandOptionType.Subcommand),\n\toptions: z.array(z.object({ type: basicOptionTypesPredicate })).max(25),\n});\n","import type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tAPIApplicationCommandBasicOption,\n\tAPIApplicationCommandOption,\n\tApplicationCommandOptionType,\n} from 'discord-api-types/v10';\nimport type { z } from 'zod';\nimport { validate } from '../../../../util/validation.js';\nimport type { SharedNameAndDescriptionData } from '../../SharedNameAndDescription.js';\nimport { SharedNameAndDescription } from '../../SharedNameAndDescription.js';\nimport { basicOptionPredicate } from '../Assertions.js';\n\nexport interface ApplicationCommandOptionBaseData extends Partial<Pick<APIApplicationCommandOption, 'required'>> {\n\ttype: ApplicationCommandOptionType;\n}\n\n/**\n * The base application command option builder that contains common symbols for application command builders.\n */\nexport abstract class ApplicationCommandOptionBase\n\textends SharedNameAndDescription\n\timplements JSONEncodable<APIApplicationCommandBasicOption>\n{\n\t/**\n\t * @internal\n\t */\n\tprotected static readonly predicate: z.ZodType = basicOptionPredicate;\n\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: ApplicationCommandOptionBaseData & SharedNameAndDescriptionData;\n\n\t/**\n\t * Creates a new application command option builder.\n\t *\n\t * @param type - The type of the option\n\t */\n\tpublic constructor(type: ApplicationCommandOptionType) {\n\t\tsuper();\n\t\tthis.data.type = type;\n\t}\n\n\t/**\n\t * Sets whether this option is required.\n\t *\n\t * @param required - Whether this option should be required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = required;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIApplicationCommandBasicOption {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate((this.constructor as typeof ApplicationCommandOptionBase).predicate, clone, validationOverride);\n\n\t\treturn clone as APIApplicationCommandBasicOption;\n\t}\n}\n","import { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command boolean option.\n */\nexport class ChatInputCommandBooleanOption extends ApplicationCommandOptionBase {\n\t/**\n\t * Creates a new boolean option.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Boolean);\n\t}\n}\n","import { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { channelOptionPredicate } from '../Assertions.js';\nimport { ApplicationCommandOptionChannelTypesMixin } from '../mixins/ApplicationCommandOptionChannelTypesMixin.js';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command channel option.\n *\n * @mixes {@link ApplicationCommandOptionBase}\n * @mixes {@link ApplicationCommandOptionChannelTypesMixin}\n */\nexport class ChatInputCommandChannelOption extends Mixin(\n\tApplicationCommandOptionBase,\n\tApplicationCommandOptionChannelTypesMixin,\n) {\n\t/**\n\t * @internal\n\t */\n\tprotected static override readonly predicate = channelOptionPredicate;\n\n\t/**\n\t * Creates a new channel option.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Channel);\n\t}\n}\n","import { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { integerOptionPredicate } from '../Assertions.js';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command integer option.\n *\n * @mixes {@link ApplicationCommandOptionBase}\n * @mixes {@link ApplicationCommandNumericOptionMinMaxValueMixin}\n * @mixes {@link ApplicationCommandOptionWithAutocompleteMixin}\n * @mixes {@link ApplicationCommandOptionWithChoicesMixin}\\<number\\>\n */\nexport class ChatInputCommandIntegerOption extends Mixin(\n\tApplicationCommandOptionBase,\n\tApplicationCommandNumericOptionMinMaxValueMixin,\n\tApplicationCommandOptionWithAutocompleteMixin,\n\tApplicationCommandOptionWithChoicesMixin<number>,\n) {\n\t/**\n\t * @internal\n\t */\n\tprotected static override readonly predicate = integerOptionPredicate;\n\n\t/**\n\t * Creates a new integer option.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Integer);\n\t}\n}\n","import { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command mentionable option.\n */\nexport class ChatInputCommandMentionableOption extends ApplicationCommandOptionBase {\n\t/**\n\t * Creates a new mentionable option.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Mentionable);\n\t}\n}\n","import { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { numberOptionPredicate } from '../Assertions.js';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command number option.\n *\n * @mixes {@link ApplicationCommandOptionBase}\n * @mixes {@link ApplicationCommandNumericOptionMinMaxValueMixin}\n * @mixes {@link ApplicationCommandOptionWithAutocompleteMixin}\n * @mixes {@link ApplicationCommandOptionWithChoicesMixin}\\<number\\>\n */\nexport class ChatInputCommandNumberOption extends Mixin(\n\tApplicationCommandOptionBase,\n\tApplicationCommandNumericOptionMinMaxValueMixin,\n\tApplicationCommandOptionWithAutocompleteMixin,\n\tApplicationCommandOptionWithChoicesMixin<number>,\n) {\n\t/**\n\t * @internal\n\t */\n\tprotected static override readonly predicate = numberOptionPredicate;\n\n\t/**\n\t * Creates a new number option.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Number);\n\t}\n}\n","import { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command role option.\n */\nexport class ChatInputCommandRoleOption extends ApplicationCommandOptionBase {\n\t/**\n\t * Creates a new role option.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.Role);\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandStringOption } from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { stringOptionPredicate } from '../Assertions.js';\nimport type { ApplicationCommandOptionWithAutocompleteData } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport { ApplicationCommandOptionWithAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithAutocompleteMixin.js';\nimport type { ApplicationCommandOptionWithChoicesData } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\nimport { ApplicationCommandOptionWithChoicesMixin } from '../mixins/ApplicationCommandOptionWithChoicesMixin.js';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\nimport type { ApplicationCommandOptionBaseData } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command string option.\n *\n * @mixes {@link ApplicationCommandOptionBase}\n * @mixes {@link ApplicationCommandOptionWithAutocompleteMixin}\n * @mixes {@link ApplicationCommandOptionWithChoicesMixin}\\<string\\>\n */\nexport class ChatInputCommandStringOption extends Mixin(\n\tApplicationCommandOptionBase,\n\tApplicationCommandOptionWithAutocompleteMixin,\n\tApplicationCommandOptionWithChoicesMixin<string>,\n) {\n\t/**\n\t * @internal\n\t */\n\tprotected static override readonly predicate = stringOptionPredicate;\n\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: ApplicationCommandOptionBaseData &\n\t\tApplicationCommandOptionWithAutocompleteData &\n\t\tApplicationCommandOptionWithChoicesData &\n\t\tPartial<Pick<APIApplicationCommandStringOption, 'max_length' | 'min_length'>>;\n\n\t/**\n\t * Creates a new string option builder.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.String);\n\t}\n\n\t/**\n\t * Sets the maximum length of this string option.\n\t *\n\t * @param max - The maximum length this option can be\n\t */\n\tpublic setMaxLength(max: number): this {\n\t\tthis.data.max_length = max;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the maximum length of this string option.\n\t */\n\tpublic clearMaxLength(): this {\n\t\tthis.data.max_length = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum length of this string option.\n\t *\n\t * @param min - The minimum length this option can be\n\t */\n\tpublic setMinLength(min: number): this {\n\t\tthis.data.min_length = min;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the minimum length of this string option.\n\t */\n\tpublic clearMinLength(): this {\n\t\tthis.data.min_length = undefined;\n\t\treturn this;\n\t}\n}\n","import { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\n/**\n * A chat input command user option.\n */\nexport class ChatInputCommandUserOption extends ApplicationCommandOptionBase {\n\t/**\n\t * Creates a new user option.\n\t */\n\tpublic constructor() {\n\t\tsuper(ApplicationCommandOptionType.User);\n\t}\n}\n","import { normalizeArray, type RestOrArray } from '../../../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../../../util/resolveBuilder.js';\nimport type { ApplicationCommandOptionBase } from '../options/ApplicationCommandOptionBase.js';\nimport { ChatInputCommandAttachmentOption } from '../options/attachment.js';\nimport { ChatInputCommandBooleanOption } from '../options/boolean.js';\nimport { ChatInputCommandChannelOption } from '../options/channel.js';\nimport { ChatInputCommandIntegerOption } from '../options/integer.js';\nimport { ChatInputCommandMentionableOption } from '../options/mentionable.js';\nimport { ChatInputCommandNumberOption } from '../options/number.js';\nimport { ChatInputCommandRoleOption } from '../options/role.js';\nimport { ChatInputCommandStringOption } from '../options/string.js';\nimport { ChatInputCommandUserOption } from '../options/user.js';\n\nexport interface SharedChatInputCommandOptionsData {\n\toptions?: ApplicationCommandOptionBase[];\n}\n\n/**\n * This mixin holds symbols that can be shared in chat input command options.\n */\nexport class SharedChatInputCommandOptions {\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: SharedChatInputCommandOptionsData;\n\n\t/**\n\t * The options within this command.\n\t */\n\tpublic get options(): readonly ApplicationCommandOptionBase[] {\n\t\treturn (this.data.options ??= []);\n\t}\n\n\t/**\n\t * Adds boolean options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addBooleanOptions(\n\t\t...options: RestOrArray<\n\t\t\tChatInputCommandBooleanOption | ((builder: ChatInputCommandBooleanOption) => ChatInputCommandBooleanOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandBooleanOption, ...options);\n\t}\n\n\t/**\n\t * Adds user options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addUserOptions(\n\t\t...options: RestOrArray<\n\t\t\tChatInputCommandUserOption | ((builder: ChatInputCommandUserOption) => ChatInputCommandUserOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandUserOption, ...options);\n\t}\n\n\t/**\n\t * Adds channel options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addChannelOptions(\n\t\t...options: RestOrArray<\n\t\t\tChatInputCommandChannelOption | ((builder: ChatInputCommandChannelOption) => ChatInputCommandChannelOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandChannelOption, ...options);\n\t}\n\n\t/**\n\t * Adds role options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addRoleOptions(\n\t\t...options: RestOrArray<\n\t\t\tChatInputCommandRoleOption | ((builder: ChatInputCommandRoleOption) => ChatInputCommandRoleOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandRoleOption, ...options);\n\t}\n\n\t/**\n\t * Adds attachment options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addAttachmentOptions(\n\t\t...options: RestOrArray<\n\t\t\t| ChatInputCommandAttachmentOption\n\t\t\t| ((builder: ChatInputCommandAttachmentOption) => ChatInputCommandAttachmentOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandAttachmentOption, ...options);\n\t}\n\n\t/**\n\t * Adds mentionable options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addMentionableOptions(\n\t\t...options: RestOrArray<\n\t\t\t| ChatInputCommandMentionableOption\n\t\t\t| ((builder: ChatInputCommandMentionableOption) => ChatInputCommandMentionableOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandMentionableOption, ...options);\n\t}\n\n\t/**\n\t * Adds string options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addStringOptions(\n\t\t...options: RestOrArray<\n\t\t\tChatInputCommandStringOption | ((builder: ChatInputCommandStringOption) => ChatInputCommandStringOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandStringOption, ...options);\n\t}\n\n\t/**\n\t * Adds integer options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addIntegerOptions(\n\t\t...options: RestOrArray<\n\t\t\tChatInputCommandIntegerOption | ((builder: ChatInputCommandIntegerOption) => ChatInputCommandIntegerOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandIntegerOption, ...options);\n\t}\n\n\t/**\n\t * Adds number options.\n\t *\n\t * @param options - Options to add\n\t */\n\tpublic addNumberOptions(\n\t\t...options: RestOrArray<\n\t\t\tChatInputCommandNumberOption | ((builder: ChatInputCommandNumberOption) => ChatInputCommandNumberOption)\n\t\t>\n\t) {\n\t\treturn this.sharedAddOptions(ChatInputCommandNumberOption, ...options);\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts options for this command.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing options for this command.\n\t * @example\n\t * Remove the first option:\n\t * ```ts\n\t * actionRow.spliceOptions(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n options:\n\t * ```ts\n\t * const n = 4;\n\t * actionRow.spliceOptions(0, n);\n\t * ```\n\t * @example\n\t * Remove the last option:\n\t * ```ts\n\t * actionRow.spliceOptions(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of options to remove\n\t * @param options - The replacing option objects\n\t */\n\tpublic spliceOptions(index: number, deleteCount: number, ...options: ApplicationCommandOptionBase[]): this {\n\t\tthis.data.options ??= [];\n\t\tthis.data.options.splice(index, deleteCount, ...options);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Where the actual adding magic happens. ✨\n\t *\n\t * @internal\n\t */\n\tprivate sharedAddOptions<OptionBuilder extends ApplicationCommandOptionBase>(\n\t\tInstance: new () => OptionBuilder,\n\t\t...options: RestOrArray<OptionBuilder | ((builder: OptionBuilder) => OptionBuilder)>\n\t): this {\n\t\tconst normalized = normalizeArray(options);\n\t\tconst resolved = normalized.map((option) => resolveBuilder(option, Instance));\n\n\t\tthis.data.options ??= [];\n\t\tthis.data.options.push(...resolved);\n\n\t\treturn this;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tAPIApplicationCommandSubcommandOption,\n\tAPIApplicationCommandSubcommandGroupOption,\n} from 'discord-api-types/v10';\nimport { ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { normalizeArray, type RestOrArray } from '../../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../../util/resolveBuilder.js';\nimport { validate } from '../../../util/validation.js';\nimport type { SharedNameAndDescriptionData } from '../SharedNameAndDescription.js';\nimport { SharedNameAndDescription } from '../SharedNameAndDescription.js';\nimport { chatInputCommandSubcommandGroupPredicate, chatInputCommandSubcommandPredicate } from './Assertions.js';\nimport { SharedChatInputCommandOptions } from './mixins/SharedChatInputCommandOptions.js';\n\nexport interface ChatInputCommandSubcommandGroupData {\n\toptions?: ChatInputCommandSubcommandBuilder[];\n}\n\n/**\n * Represents a folder for subcommands.\n *\n * @see {@link https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups}\n */\nexport class ChatInputCommandSubcommandGroupBuilder\n\textends SharedNameAndDescription\n\timplements JSONEncodable<APIApplicationCommandSubcommandGroupOption>\n{\n\t/**\n\t * The API data associated with this subcommand group.\n\t *\n\t * @internal\n\t */\n\tdeclare protected readonly data: ChatInputCommandSubcommandGroupData & SharedNameAndDescriptionData;\n\n\t/**\n\t * The options within this subcommand group.\n\t */\n\tpublic get options(): readonly ChatInputCommandSubcommandBuilder[] {\n\t\treturn (this.data.options ??= []);\n\t}\n\n\t/**\n\t * Adds a new subcommand to this group.\n\t *\n\t * @param input - A function that returns a subcommand builder or an already built builder\n\t */\n\tpublic addSubcommands(\n\t\t...input: RestOrArray<\n\t\t\t| ChatInputCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: ChatInputCommandSubcommandBuilder) => ChatInputCommandSubcommandBuilder)\n\t\t>\n\t) {\n\t\tconst normalized = normalizeArray(input);\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tconst result = normalized.map((builder) => resolveBuilder(builder, ChatInputCommandSubcommandBuilder));\n\n\t\tthis.data.options ??= [];\n\t\tthis.data.options.push(...result);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIApplicationCommandSubcommandGroupOption {\n\t\tconst { options, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...(structuredClone(rest) as Omit<APIApplicationCommandSubcommandGroupOption, 'type'>),\n\t\t\ttype: ApplicationCommandOptionType.SubcommandGroup as const,\n\t\t\toptions: options?.map((option) => option.toJSON(validationOverride)) ?? [],\n\t\t};\n\n\t\tvalidate(chatInputCommandSubcommandGroupPredicate, data, validationOverride);\n\n\t\treturn data;\n\t}\n}\n\n/**\n * A builder that creates API-compatible JSON data for chat input command subcommands.\n *\n * @mixes {@link SharedNameAndDescription}\n * @mixes {@link SharedChatInputCommandOptions}\n * @see {@link https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups}\n */\nexport class ChatInputCommandSubcommandBuilder\n\textends Mixin(SharedNameAndDescription, SharedChatInputCommandOptions)\n\timplements JSONEncodable<APIApplicationCommandSubcommandOption>\n{\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIApplicationCommandSubcommandOption {\n\t\tconst { options, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...(structuredClone(rest) as Omit<APIApplicationCommandSubcommandOption, 'type'>),\n\t\t\ttype: ApplicationCommandOptionType.Subcommand as const,\n\t\t\toptions: options?.map((option) => option.toJSON(validationOverride)) ?? [],\n\t\t};\n\n\t\tvalidate(chatInputCommandSubcommandPredicate, data, validationOverride);\n\n\t\treturn data;\n\t}\n}\n","import type { RestOrArray } from '../../../../util/normalizeArray.js';\nimport { normalizeArray } from '../../../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../../../util/resolveBuilder.js';\nimport {\n\tChatInputCommandSubcommandGroupBuilder,\n\tChatInputCommandSubcommandBuilder,\n} from '../ChatInputCommandSubcommands.js';\n\nexport interface SharedChatInputCommandSubcommandsData {\n\toptions?: (ChatInputCommandSubcommandBuilder | ChatInputCommandSubcommandGroupBuilder)[];\n}\n\n/**\n * This mixin holds symbols that can be shared in chat input subcommands.\n */\nexport class SharedChatInputCommandSubcommands {\n\t/**\n\t * @internal\n\t */\n\tdeclare protected readonly data: SharedChatInputCommandSubcommandsData;\n\n\t/**\n\t * Adds subcommand groups to this command.\n\t *\n\t * @param input - Subcommand groups to add\n\t */\n\tpublic addSubcommandGroups(\n\t\t...input: RestOrArray<\n\t\t\t| ChatInputCommandSubcommandGroupBuilder\n\t\t\t| ((subcommandGroup: ChatInputCommandSubcommandGroupBuilder) => ChatInputCommandSubcommandGroupBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((value) => resolveBuilder(value, ChatInputCommandSubcommandGroupBuilder));\n\n\t\tthis.data.options ??= [];\n\t\tthis.data.options.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds subcommands to this command.\n\t *\n\t * @param input - Subcommands to add\n\t */\n\tpublic addSubcommands(\n\t\t...input: RestOrArray<\n\t\t\t| ChatInputCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: ChatInputCommandSubcommandBuilder) => ChatInputCommandSubcommandBuilder)\n\t\t>\n\t): this {\n\t\tconst normalized = normalizeArray(input);\n\t\tconst resolved = normalized.map((value) => resolveBuilder(value, ChatInputCommandSubcommandBuilder));\n\n\t\tthis.data.options ??= [];\n\t\tthis.data.options.push(...resolved);\n\n\t\treturn this;\n\t}\n}\n","import { ApplicationCommandType, type RESTPostAPIChatInputApplicationCommandsJSONBody } from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { validate } from '../../../util/validation.js';\nimport { CommandBuilder } from '../Command.js';\nimport { SharedNameAndDescription } from '../SharedNameAndDescription.js';\nimport { chatInputCommandPredicate } from './Assertions.js';\nimport { SharedChatInputCommandOptions } from './mixins/SharedChatInputCommandOptions.js';\nimport { SharedChatInputCommandSubcommands } from './mixins/SharedSubcommands.js';\n\n/**\n * A builder that creates API-compatible JSON data for chat input commands.\n *\n * @mixes {@link CommandBuilder}\\<{@link discord-api-types/v10#(RESTPostAPIChatInputApplicationCommandsJSONBody:interface)}\\>\n * @mixes {@link SharedChatInputCommandOptions}\n * @mixes {@link SharedNameAndDescription}\n * @mixes {@link SharedChatInputCommandSubcommands}\n */\nexport class ChatInputCommandBuilder extends Mixin(\n\tCommandBuilder<RESTPostAPIChatInputApplicationCommandsJSONBody>,\n\tSharedChatInputCommandOptions,\n\tSharedNameAndDescription,\n\tSharedChatInputCommandSubcommands,\n) {\n\t/**\n\t * {@inheritDoc CommandBuilder.toJSON}\n\t */\n\tpublic toJSON(validationOverride?: boolean): RESTPostAPIChatInputApplicationCommandsJSONBody {\n\t\tconst { options, ...rest } = this.data;\n\n\t\tconst data: RESTPostAPIChatInputApplicationCommandsJSONBody = {\n\t\t\t...structuredClone(rest as Omit<RESTPostAPIChatInputApplicationCommandsJSONBody, 'options'>),\n\t\t\ttype: ApplicationCommandType.ChatInput,\n\t\t\toptions: options?.map((option) => option.toJSON(validationOverride)),\n\t\t};\n\n\t\tvalidate(chatInputCommandPredicate, data, validationOverride);\n\n\t\treturn data;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tApplicationIntegrationType,\n\tInteractionContextType,\n\tPermissions,\n\tRESTPostAPIApplicationCommandsJSONBody,\n} from 'discord-api-types/v10';\nimport type { RestOrArray } from '../../util/normalizeArray.js';\nimport { normalizeArray } from '../../util/normalizeArray.js';\n\nexport interface CommandData extends Partial<\n\tPick<RESTPostAPIApplicationCommandsJSONBody, 'contexts' | 'default_member_permissions' | 'integration_types' | 'nsfw'>\n> {}\n\n/**\n * The base class for all command builders.\n */\nexport abstract class CommandBuilder<\n\tCommand extends RESTPostAPIApplicationCommandsJSONBody,\n> implements JSONEncodable<Command> {\n\t/**\n\t * The API data associated with this command.\n\t *\n\t * @internal\n\t */\n\tdeclare protected readonly data: CommandData;\n\n\t/**\n\t * Sets the contexts of this command.\n\t *\n\t * @param contexts - The contexts\n\t */\n\tpublic setContexts(...contexts: RestOrArray<InteractionContextType>) {\n\t\tthis.data.contexts = normalizeArray(contexts);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the integration types of this command.\n\t *\n\t * @param integrationTypes - The integration types\n\t */\n\tpublic setIntegrationTypes(...integrationTypes: RestOrArray<ApplicationIntegrationType>) {\n\t\tthis.data.integration_types = normalizeArray(integrationTypes);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the default permissions a member should have in order to run the command.\n\t *\n\t * @remarks\n\t * You can set this to `'0'` to disable the command by default.\n\t * @param permissions - The permissions bit field to set\n\t * @see {@link https://discord.com/developers/docs/interactions/application-commands#permissions}\n\t */\n\tpublic setDefaultMemberPermissions(permissions: Permissions | bigint | number) {\n\t\tthis.data.default_member_permissions = typeof permissions === 'string' ? permissions : permissions.toString();\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the default permissions a member should have in order to run the command.\n\t */\n\tpublic clearDefaultMemberPermissions() {\n\t\tthis.data.default_member_permissions = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this command is NSFW.\n\t *\n\t * @param nsfw - Whether this command is NSFW\n\t */\n\tpublic setNSFW(nsfw = true) {\n\t\tthis.data.nsfw = nsfw;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic abstract toJSON(validationOverride?: boolean): Command;\n}\n","import { ApplicationCommandType, ApplicationIntegrationType, InteractionContextType } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { localeMapPredicate, memberPermissionsPredicate } from '../../../Assertions.js';\n\nconst namePredicate = z\n\t.string()\n\t.min(1)\n\t.max(32)\n\t.refine((val) => val.trim().length > 0, {\n\t\terror: 'Must not consist of only whitespace.',\n\t});\n\nconst contextsPredicate = z.array(z.enum(InteractionContextType));\nconst integrationTypesPredicate = z.array(z.enum(ApplicationIntegrationType));\n\nconst baseContextMenuCommandPredicate = z.object({\n\tcontexts: contextsPredicate.optional(),\n\tdefault_member_permissions: memberPermissionsPredicate.optional(),\n\tname: namePredicate,\n\tname_localizations: localeMapPredicate.optional(),\n\tintegration_types: integrationTypesPredicate.optional(),\n\tnsfw: z.boolean().optional(),\n});\n\nexport const userCommandPredicate = baseContextMenuCommandPredicate.extend({\n\ttype: z.literal(ApplicationCommandType.User),\n});\n\nexport const messageCommandPredicate = baseContextMenuCommandPredicate.extend({\n\ttype: z.literal(ApplicationCommandType.Message),\n});\n","import type { ApplicationCommandType, RESTPostAPIContextMenuApplicationCommandsJSONBody } from 'discord-api-types/v10';\nimport { Mixin } from 'ts-mixer';\nimport { CommandBuilder } from '../Command.js';\nimport { SharedName } from '../SharedName.js';\n\n/**\n * The type a context menu command can be.\n */\nexport type ContextMenuCommandType = ApplicationCommandType.Message | ApplicationCommandType.User;\n\n/**\n * A builder that creates API-compatible JSON data for context menu commands.\n *\n * @mixes {@link CommandBuilder}\\<{@link discord-api-types/v10#(RESTPostAPIContextMenuApplicationCommandsJSONBody:interface)}\\>\n * @mixes {@link SharedName}\n */\nexport abstract class ContextMenuCommandBuilder extends Mixin(\n\tCommandBuilder<RESTPostAPIContextMenuApplicationCommandsJSONBody>,\n\tSharedName,\n) {\n\t/**\n\t * The API data associated with this context menu command.\n\t *\n\t * @internal\n\t */\n\tprotected override readonly data: Partial<RESTPostAPIContextMenuApplicationCommandsJSONBody>;\n\n\t/**\n\t * Creates a new context menu command.\n\t *\n\t * @param data - The API data to create this context menu command with\n\t */\n\tpublic constructor(data: Partial<RESTPostAPIContextMenuApplicationCommandsJSONBody> = {}) {\n\t\tsuper();\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * {@inheritDoc CommandBuilder.toJSON}\n\t */\n\tpublic abstract override toJSON(validationOverride?: boolean): RESTPostAPIContextMenuApplicationCommandsJSONBody;\n}\n","import { ApplicationCommandType, type RESTPostAPIContextMenuApplicationCommandsJSONBody } from 'discord-api-types/v10';\nimport { validate } from '../../../util/validation.js';\nimport { messageCommandPredicate } from './Assertions.js';\nimport { ContextMenuCommandBuilder } from './ContextMenuCommand.js';\n\n/**\n * A builder that creates API-compatible JSON data for message context menu commands.\n */\nexport class MessageContextCommandBuilder extends ContextMenuCommandBuilder {\n\t/**\n\t * {@inheritDoc CommandBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): RESTPostAPIContextMenuApplicationCommandsJSONBody {\n\t\tconst data = { ...structuredClone(this.data), type: ApplicationCommandType.Message };\n\t\tvalidate(messageCommandPredicate, data, validationOverride);\n\n\t\treturn data as RESTPostAPIContextMenuApplicationCommandsJSONBody;\n\t}\n}\n","import { ApplicationCommandType, type RESTPostAPIContextMenuApplicationCommandsJSONBody } from 'discord-api-types/v10';\nimport { validate } from '../../../util/validation.js';\nimport { userCommandPredicate } from './Assertions.js';\nimport { ContextMenuCommandBuilder } from './ContextMenuCommand.js';\n\n/**\n * A builder that creates API-compatible JSON data for user context menu commands.\n */\nexport class UserContextCommandBuilder extends ContextMenuCommandBuilder {\n\t/**\n\t * {@inheritDoc CommandBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): RESTPostAPIContextMenuApplicationCommandsJSONBody {\n\t\tconst data = { ...structuredClone(this.data), type: ApplicationCommandType.User };\n\t\tvalidate(userCommandPredicate, data, validationOverride);\n\n\t\treturn data as RESTPostAPIContextMenuApplicationCommandsJSONBody;\n\t}\n}\n","import { ComponentType } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { customIdPredicate } from '../../Assertions.js';\nimport { labelPredicate } from '../../components/label/Assertions.js';\nimport { textDisplayPredicate } from '../../components/v2/Assertions.js';\n\nconst titlePredicate = z.string().min(1).max(45);\n\nexport const modalPredicate = z.object({\n\ttitle: titlePredicate,\n\tcustom_id: customIdPredicate,\n\tcomponents: z\n\t\t.union([\n\t\t\tz.object({\n\t\t\t\ttype: z.literal(ComponentType.ActionRow),\n\t\t\t\tcomponents: z\n\t\t\t\t\t.object({ type: z.literal(ComponentType.TextInput) })\n\t\t\t\t\t.array()\n\t\t\t\t\t.length(1),\n\t\t\t}),\n\t\t\tlabelPredicate,\n\t\t\ttextDisplayPredicate,\n\t\t])\n\t\t.array()\n\t\t.min(1)\n\t\t.max(5),\n});\n","import type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tAPILabelComponent,\n\tAPIModalInteractionResponseCallbackData,\n\tAPITextDisplayComponent,\n} from 'discord-api-types/v10';\nimport type { ActionRowBuilder } from '../../components/ActionRow.js';\nimport type { AnyModalComponentBuilder } from '../../components/Components.js';\nimport { createComponentBuilder } from '../../components/Components.js';\nimport { LabelBuilder } from '../../components/label/Label.js';\nimport { TextDisplayBuilder } from '../../components/v2/TextDisplay.js';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../util/resolveBuilder.js';\nimport { validate } from '../../util/validation.js';\nimport { modalPredicate } from './Assertions.js';\n\nexport interface ModalBuilderData extends Partial<Omit<APIModalInteractionResponseCallbackData, 'components'>> {\n\tcomponents: (ActionRowBuilder | AnyModalComponentBuilder)[];\n}\n\n/**\n * A builder that creates API-compatible JSON data for modals.\n */\nexport class ModalBuilder implements JSONEncodable<APIModalInteractionResponseCallbackData> {\n\t/**\n\t * The API data associated with this modal.\n\t */\n\tprivate readonly data: ModalBuilderData;\n\n\t/**\n\t * The components within this modal.\n\t */\n\tpublic get components(): readonly (ActionRowBuilder | AnyModalComponentBuilder)[] {\n\t\treturn this.data.components;\n\t}\n\n\t/**\n\t * Creates a new modal.\n\t *\n\t * @param data - The API data to create this modal with\n\t */\n\tpublic constructor(data: Partial<APIModalInteractionResponseCallbackData> = {}) {\n\t\tconst { components = [], ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tcomponents: components.map((component) => createComponentBuilder(component)),\n\t\t};\n\t}\n\n\t/**\n\t * Sets the title of this modal.\n\t *\n\t * @param title - The title to use\n\t */\n\tpublic setTitle(title: string) {\n\t\tthis.data.title = title;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom id of this modal.\n\t *\n\t * @param customId - The custom id to use\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customId;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds label components to this modal.\n\t *\n\t * @param components - The components to add\n\t */\n\tpublic addLabelComponents(\n\t\t...components: RestOrArray<APILabelComponent | LabelBuilder | ((builder: LabelBuilder) => LabelBuilder)>\n\t) {\n\t\tconst normalized = normalizeArray(components);\n\t\tconst resolved = normalized.map((label) => resolveBuilder(label, LabelBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds text display components to this modal.\n\t *\n\t * @param components - The components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t) {\n\t\tconst normalized = normalizeArray(components);\n\t\tconst resolved = normalized.map((row) => resolveBuilder(row, TextDisplayBuilder));\n\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts components for this modal.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t * The maximum amount of components that can be added is 5.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing components of a modal.\n\t * @example\n\t * Remove the first component:\n\t * ```ts\n\t * modal.spliceComponents(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n components:\n\t * ```ts\n\t * const n = 4;\n\t * modal.spliceComponents(0, n);\n\t * ```\n\t * @example\n\t * Remove the last component:\n\t * ```ts\n\t * modal.spliceComponents(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of components to remove\n\t * @param components - The replacing components\n\t */\n\tpublic spliceComponents(index: number, deleteCount: number, ...components: AnyModalComponentBuilder[]): this {\n\t\tthis.data.components.splice(index, deleteCount, ...components);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIModalInteractionResponseCallbackData {\n\t\tconst { components, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\tcomponents: components.map((component) => component.toJSON(validationOverride)),\n\t\t};\n\n\t\tvalidate(modalPredicate, data, validationOverride);\n\n\t\treturn data as APIModalInteractionResponseCallbackData;\n\t}\n}\n","import { embedLength } from '@discordjs/util';\nimport { z } from 'zod';\n\nconst namePredicate = z.string().max(256);\n\nconst URLPredicate = z.url({ protocol: /^https?$/ });\n\nconst URLWithAttachmentProtocolPredicate = z.url({ protocol: /^(?:https?|attachment)$/ });\n\nexport const embedFieldPredicate = z.object({\n\tname: namePredicate,\n\tvalue: z.string().max(1_024),\n\tinline: z.boolean().optional(),\n});\n\nexport const embedAuthorPredicate = z.object({\n\tname: namePredicate.min(1),\n\ticon_url: URLWithAttachmentProtocolPredicate.optional(),\n\turl: URLPredicate.optional(),\n});\n\nexport const embedFooterPredicate = z.object({\n\ttext: z.string().min(1).max(2_048),\n\ticon_url: URLWithAttachmentProtocolPredicate.optional(),\n});\n\nexport const embedPredicate = z\n\t.object({\n\t\ttitle: namePredicate.min(1).optional(),\n\t\tdescription: z.string().min(1).max(4_096).optional(),\n\t\turl: URLPredicate.optional(),\n\t\ttimestamp: z.string().optional(),\n\t\tcolor: z.int().min(0).max(0xffffff).optional(),\n\t\tfooter: embedFooterPredicate.optional(),\n\t\timage: z.object({ url: URLWithAttachmentProtocolPredicate }).optional(),\n\t\tthumbnail: z.object({ url: URLWithAttachmentProtocolPredicate }).optional(),\n\t\tauthor: embedAuthorPredicate.optional(),\n\t\tfields: z.array(embedFieldPredicate).max(25).optional(),\n\t})\n\t.refine(\n\t\t(embed) =>\n\t\t\tembed.title !== undefined ||\n\t\t\tembed.description !== undefined ||\n\t\t\t(embed.fields !== undefined && embed.fields.length > 0) ||\n\t\t\tembed.footer !== undefined ||\n\t\t\tembed.author !== undefined ||\n\t\t\tembed.image !== undefined ||\n\t\t\tembed.thumbnail !== undefined,\n\t\t{\n\t\t\terror: 'Embed must have at least a title, description, a field, a footer, an author, an image, OR a thumbnail.',\n\t\t},\n\t)\n\t.refine((embed) => embedLength(embed) <= 6_000, { error: 'Embeds must not exceed 6000 characters in total.' });\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIEmbedAuthor } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { embedAuthorPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for the embed author.\n */\nexport class EmbedAuthorBuilder implements JSONEncodable<APIEmbedAuthor> {\n\t/**\n\t * The API data associated with this embed author.\n\t */\n\tprivate readonly data: Partial<APIEmbedAuthor>;\n\n\t/**\n\t * Creates a new embed author.\n\t *\n\t * @param data - The API data to create this embed author with\n\t */\n\tpublic constructor(data: Partial<APIEmbedAuthor> = {}) {\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * Sets the name for this embed author.\n\t *\n\t * @param name - The name to use\n\t */\n\tpublic setName(name: string): this {\n\t\tthis.data.name = name;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the URL for this embed author.\n\t *\n\t * @param url - The url to use\n\t */\n\tpublic setURL(url: string): this {\n\t\tthis.data.url = url;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the URL for this embed author.\n\t */\n\tpublic clearURL(): this {\n\t\tthis.data.url = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the icon URL for this embed author.\n\t *\n\t * @param iconURL - The icon URL to use\n\t */\n\tpublic setIconURL(iconURL: string): this {\n\t\tthis.data.icon_url = iconURL;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the icon URL for this embed author.\n\t */\n\tpublic clearIconURL(): this {\n\t\tthis.data.icon_url = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIEmbedAuthor {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(embedAuthorPredicate, clone, validationOverride);\n\n\t\treturn clone as APIEmbedAuthor;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIEmbedField } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { embedFieldPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for embed fields.\n */\nexport class EmbedFieldBuilder implements JSONEncodable<APIEmbedField> {\n\t/**\n\t * The API data associated with this embed field.\n\t */\n\tprivate readonly data: Partial<APIEmbedField>;\n\n\t/**\n\t * Creates a new embed field.\n\t *\n\t * @param data - The API data to create this embed field with\n\t */\n\tpublic constructor(data: Partial<APIEmbedField> = {}) {\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * Sets the name for this embed field.\n\t *\n\t * @param name - The name to use\n\t */\n\tpublic setName(name: string): this {\n\t\tthis.data.name = name;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value for this embed field.\n\t *\n\t * @param value - The value to use\n\t */\n\tpublic setValue(value: string): this {\n\t\tthis.data.value = value;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this field should display inline.\n\t *\n\t * @param inline - Whether this field should display inline\n\t */\n\tpublic setInline(inline = true): this {\n\t\tthis.data.inline = inline;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIEmbedField {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(embedFieldPredicate, clone, validationOverride);\n\n\t\treturn clone as APIEmbedField;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIEmbedFooter } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { embedFooterPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for the embed footer.\n */\nexport class EmbedFooterBuilder implements JSONEncodable<APIEmbedFooter> {\n\t/**\n\t * The API data associated with this embed footer.\n\t */\n\tprivate readonly data: Partial<APIEmbedFooter>;\n\n\t/**\n\t * Creates a new embed footer.\n\t *\n\t * @param data - The API data to create this embed footer with\n\t */\n\tpublic constructor(data: Partial<APIEmbedFooter> = {}) {\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * Sets the text for this embed footer.\n\t *\n\t * @param text - The text to use\n\t */\n\tpublic setText(text: string): this {\n\t\tthis.data.text = text;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the url for this embed footer.\n\t *\n\t * @param url - The url to use\n\t */\n\tpublic setIconURL(url: string): this {\n\t\tthis.data.icon_url = url;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the icon URL for this embed footer.\n\t */\n\tpublic clearIconURL(): this {\n\t\tthis.data.icon_url = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIEmbedFooter {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(embedFooterPredicate, clone, validationOverride);\n\n\t\treturn clone as APIEmbedFooter;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIEmbed, APIEmbedAuthor, APIEmbedField, APIEmbedFooter } from 'discord-api-types/v10';\nimport type { RestOrArray } from '../../util/normalizeArray.js';\nimport { normalizeArray } from '../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../util/resolveBuilder.js';\nimport { validate } from '../../util/validation.js';\nimport { embedPredicate } from './Assertions.js';\nimport { EmbedAuthorBuilder } from './EmbedAuthor.js';\nimport { EmbedFieldBuilder } from './EmbedField.js';\nimport { EmbedFooterBuilder } from './EmbedFooter.js';\n\n/**\n * Data stored in the process of constructing an embed.\n */\nexport interface EmbedBuilderData extends Omit<APIEmbed, 'author' | 'fields' | 'footer'> {\n\tauthor?: EmbedAuthorBuilder;\n\tfields: EmbedFieldBuilder[];\n\tfooter?: EmbedFooterBuilder;\n}\n\n/**\n * A builder that creates API-compatible JSON data for embeds.\n */\nexport class EmbedBuilder implements JSONEncodable<APIEmbed> {\n\t/**\n\t * The API data associated with this embed.\n\t */\n\tprivate readonly data: EmbedBuilderData;\n\n\t/**\n\t * Gets the fields of this embed.\n\t */\n\tpublic get fields(): readonly EmbedFieldBuilder[] {\n\t\treturn this.data.fields;\n\t}\n\n\t/**\n\t * Creates a new embed.\n\t *\n\t * @param data - The API data to create this embed with\n\t */\n\tpublic constructor(data: Partial<APIEmbed> = {}) {\n\t\tconst { author, fields = [], footer, ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tauthor: author && new EmbedAuthorBuilder(author),\n\t\t\tfields: fields.map((field) => new EmbedFieldBuilder(field)),\n\t\t\tfooter: footer && new EmbedFooterBuilder(footer),\n\t\t};\n\t}\n\n\t/**\n\t * Appends fields to the embed.\n\t *\n\t * @remarks\n\t * This method accepts either an array of fields or a variable number of field parameters.\n\t * The maximum amount of fields that can be added is 25.\n\t * @example\n\t * Using an array:\n\t * ```ts\n\t * const fields: APIEmbedField[] = ...;\n\t * const embed = new EmbedBuilder()\n\t * \t.addFields(fields);\n\t * ```\n\t * @example\n\t * Using rest parameters (variadic):\n\t * ```ts\n\t * const embed = new EmbedBuilder()\n\t * \t.addFields(\n\t * \t\t{ name: 'Field 1', value: 'Value 1' },\n\t * \t\t{ name: 'Field 2', value: 'Value 2' },\n\t * \t);\n\t * ```\n\t * @param fields - The fields to add\n\t */\n\tpublic addFields(\n\t\t...fields: RestOrArray<APIEmbedField | EmbedFieldBuilder | ((builder: EmbedFieldBuilder) => EmbedFieldBuilder)>\n\t): this {\n\t\tconst normalizedFields = normalizeArray(fields);\n\t\tconst resolved = normalizedFields.map((field) => resolveBuilder(field, EmbedFieldBuilder));\n\n\t\tthis.data.fields.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts fields for this embed.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t * The maximum amount of fields that can be added is 25.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing fields of an embed.\n\t * @example\n\t * Remove the first field:\n\t * ```ts\n\t * embed.spliceFields(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n fields:\n\t * ```ts\n\t * const n = 4;\n\t * embed.spliceFields(0, n);\n\t * ```\n\t * @example\n\t * Remove the last field:\n\t * ```ts\n\t * embed.spliceFields(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of fields to remove\n\t * @param fields - The replacing field objects\n\t */\n\tpublic spliceFields(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...fields: (APIEmbedField | EmbedFieldBuilder | ((builder: EmbedFieldBuilder) => EmbedFieldBuilder))[]\n\t): this {\n\t\tconst resolved = fields.map((field) => resolveBuilder(field, EmbedFieldBuilder));\n\t\tthis.data.fields.splice(index, deleteCount, ...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the fields for this embed.\n\t *\n\t * @remarks\n\t * This method is an alias for {@link EmbedBuilder.spliceFields}. More specifically,\n\t * it splices the entire array of fields, replacing them with the provided fields.\n\t *\n\t * You can set a maximum of 25 fields.\n\t * @param fields - The fields to set\n\t */\n\tpublic setFields(\n\t\t...fields: RestOrArray<APIEmbedField | EmbedFieldBuilder | ((builder: EmbedFieldBuilder) => EmbedFieldBuilder)>\n\t): this {\n\t\tthis.spliceFields(0, this.data.fields.length, ...normalizeArray(fields));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the author of this embed.\n\t *\n\t * @param options - The options to use\n\t */\n\tpublic setAuthor(\n\t\toptions: APIEmbedAuthor | EmbedAuthorBuilder | ((builder: EmbedAuthorBuilder) => EmbedAuthorBuilder),\n\t): this {\n\t\tthis.data.author = resolveBuilder(options, EmbedAuthorBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the author of this embed (and creates it if it doesn't exist).\n\t *\n\t * @param updater - The function to update the author with\n\t */\n\tpublic updateAuthor(updater: (builder: EmbedAuthorBuilder) => void) {\n\t\tupdater((this.data.author ??= new EmbedAuthorBuilder()));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the author of this embed.\n\t */\n\tpublic clearAuthor(): this {\n\t\tthis.data.author = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the color of this embed.\n\t *\n\t * @param color - The color to use\n\t */\n\tpublic setColor(color: number): this {\n\t\tthis.data.color = color;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the color of this embed.\n\t */\n\tpublic clearColor(): this {\n\t\tthis.data.color = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this embed.\n\t *\n\t * @param description - The description to use\n\t */\n\tpublic setDescription(description: string): this {\n\t\tthis.data.description = description;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description of this embed.\n\t */\n\tpublic clearDescription(): this {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the footer of this embed.\n\t *\n\t * @param options - The footer to use\n\t */\n\tpublic setFooter(\n\t\toptions: APIEmbedFooter | EmbedFooterBuilder | ((builder: EmbedFooterBuilder) => EmbedFooterBuilder),\n\t): this {\n\t\tthis.data.footer = resolveBuilder(options, EmbedFooterBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the footer of this embed (and creates it if it doesn't exist).\n\t *\n\t * @param updater - The function to update the footer with\n\t */\n\tpublic updateFooter(updater: (builder: EmbedFooterBuilder) => void) {\n\t\tupdater((this.data.footer ??= new EmbedFooterBuilder()));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the footer of this embed.\n\t */\n\tpublic clearFooter(): this {\n\t\tthis.data.footer = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the image of this embed.\n\t *\n\t * @param url - The image URL to use\n\t */\n\tpublic setImage(url: string): this {\n\t\tthis.data.image = { url };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the image of this embed.\n\t */\n\tpublic clearImage(): this {\n\t\tthis.data.image = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the thumbnail of this embed.\n\t *\n\t * @param url - The thumbnail URL to use\n\t */\n\tpublic setThumbnail(url: string): this {\n\t\tthis.data.thumbnail = { url };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the thumbnail of this embed.\n\t */\n\tpublic clearThumbnail(): this {\n\t\tthis.data.thumbnail = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the timestamp of this embed.\n\t *\n\t * @param timestamp - The timestamp or date to use\n\t */\n\tpublic setTimestamp(timestamp: Date | number | string = Date.now()): this {\n\t\tthis.data.timestamp = new Date(timestamp).toISOString();\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the timestamp of this embed.\n\t */\n\tpublic clearTimestamp(): this {\n\t\tthis.data.timestamp = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the title for this embed.\n\t *\n\t * @param title - The title to use\n\t */\n\tpublic setTitle(title: string): this {\n\t\tthis.data.title = title;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the title of this embed.\n\t */\n\tpublic clearTitle(): this {\n\t\tthis.data.title = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the URL of this embed.\n\t *\n\t * @param url - The URL to use\n\t */\n\tpublic setURL(url: string): this {\n\t\tthis.data.url = url;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the URL of this embed.\n\t */\n\tpublic clearURL(): this {\n\t\tthis.data.url = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIEmbed {\n\t\tconst { author, fields, footer, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\t// Disable validation because the embedPredicate below will validate those as well\n\t\t\tauthor: author?.toJSON(false),\n\t\t\tfields: fields.map((field) => field.toJSON(false)),\n\t\t\tfooter: footer?.toJSON(false),\n\t\t};\n\n\t\tvalidate(embedPredicate, data, validationOverride);\n\n\t\treturn data;\n\t}\n}\n","import { PollLayoutType } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { emojiPredicate } from '../../components/Assertions';\n\nexport const pollQuestionPredicate = z.object({ text: z.string().min(1).max(300) });\n\nexport const pollAnswerMediaPredicate = z.object({\n\ttext: z.string().min(1).max(55),\n\temoji: emojiPredicate.optional(),\n});\n\nexport const pollAnswerPredicate = z.object({ poll_media: pollAnswerMediaPredicate });\n\nexport const pollPredicate = z.object({\n\tquestion: pollQuestionPredicate,\n\tanswers: z.array(pollAnswerPredicate).min(1).max(10),\n\tduration: z.number().min(1).max(768).optional(),\n\tallow_multiselect: z.boolean().optional(),\n\tlayout_type: z.enum(PollLayoutType).optional(),\n});\n","import type { APIPollMedia } from 'discord-api-types/v10';\n\n/**\n * The base poll media builder that contains common symbols for poll media builders.\n */\nexport abstract class PollMediaBuilder {\n\t/**\n\t * The API data associated with this poll media.\n\t *\n\t * @internal\n\t */\n\tprotected readonly data: Partial<APIPollMedia>;\n\n\t/**\n\t * Creates new poll media.\n\t *\n\t * @param data - The API data to create this poll media with\n\t */\n\tpublic constructor(data: Partial<APIPollMedia> = {}) {\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * Sets the text for this poll media.\n\t *\n\t * @param text - The text to use\n\t */\n\tpublic setText(text: string): this {\n\t\tthis.data.text = text;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic abstract toJSON(validationOverride?: boolean): APIPollMedia;\n}\n","import type { APIPartialEmoji, APIPollMedia } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { pollAnswerMediaPredicate } from './Assertions.js';\nimport { PollMediaBuilder } from './PollMedia.js';\n\n/**\n * A builder that creates API-compatible JSON data for the media of a poll answer.\n */\nexport class PollAnswerMediaBuilder extends PollMediaBuilder {\n\t/**\n\t * Sets the emoji for this poll answer media.\n\t *\n\t * @param emoji - The emoji to use\n\t */\n\tpublic setEmoji(emoji: APIPartialEmoji): this {\n\t\tthis.data.emoji = emoji;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the emoji for this poll answer media.\n\t */\n\tpublic clearEmoji(): this {\n\t\tthis.data.emoji = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc PollMediaBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): APIPollMedia {\n\t\tconst clone = structuredClone(this.data);\n\n\t\tvalidate(pollAnswerMediaPredicate, clone, validationOverride);\n\n\t\treturn clone;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIPollAnswer, APIPollMedia } from 'discord-api-types/v10';\nimport { resolveBuilder } from '../../util/resolveBuilder';\nimport { validate } from '../../util/validation';\nimport { pollAnswerPredicate } from './Assertions';\nimport { PollAnswerMediaBuilder } from './PollAnswerMedia';\n\nexport interface PollAnswerData extends Omit<APIPollAnswer, 'answer_id' | 'poll_media'> {\n\tpoll_media: PollAnswerMediaBuilder;\n}\n\n/**\n * A builder that creates API-compatible JSON data for poll answers.\n */\nexport class PollAnswerBuilder implements JSONEncodable<Omit<APIPollAnswer, 'answer_id'>> {\n\t/**\n\t * The API data associated with this poll answer.\n\t */\n\tprivate readonly data: PollAnswerData;\n\n\t/**\n\t * Creates a new poll answer.\n\t *\n\t * @param data - The API data to create this poll answer with\n\t */\n\tpublic constructor(data: Partial<Omit<APIPollAnswer, 'answer_id'>> = {}) {\n\t\tconst { poll_media, ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tpoll_media: new PollAnswerMediaBuilder(poll_media),\n\t\t};\n\t}\n\n\t/**\n\t * Sets the media for this poll answer.\n\t *\n\t * @param options - The data to use for this poll answer's media\n\t */\n\tpublic setMedia(\n\t\toptions: APIPollMedia | PollAnswerMediaBuilder | ((builder: PollAnswerMediaBuilder) => PollAnswerMediaBuilder),\n\t): this {\n\t\tthis.data.poll_media = resolveBuilder(options, PollAnswerMediaBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the media of this poll answer.\n\t *\n\t * @param updater - The function to update the media with\n\t */\n\tpublic updateMedia(updater: (builder: PollAnswerMediaBuilder) => void): this {\n\t\tupdater(this.data.poll_media);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): Omit<APIPollAnswer, 'answer_id'> {\n\t\tconst { poll_media, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\t// Disable validation because the pollAnswerPredicate below will validate this as well\n\t\t\tpoll_media: poll_media.toJSON(false),\n\t\t};\n\n\t\tvalidate(pollAnswerPredicate, data, validationOverride);\n\n\t\treturn data;\n\t}\n}\n","import type { APIPollMedia } from 'discord-api-types/v10';\nimport { validate } from '../../util/validation.js';\nimport { pollQuestionPredicate } from './Assertions.js';\nimport { PollMediaBuilder } from './PollMedia.js';\n\n/**\n * A builder that creates API-compatible JSON data for a poll question.\n */\nexport class PollQuestionBuilder extends PollMediaBuilder {\n\t/**\n\t * {@inheritDoc PollMediaBuilder.toJSON}\n\t */\n\tpublic override toJSON(validationOverride?: boolean): Omit<APIPollMedia, 'emoji'> {\n\t\tconst clone = structuredClone(this.data);\n\n\t\tvalidate(pollQuestionPredicate, clone, validationOverride);\n\n\t\treturn clone;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { RESTAPIPoll, APIPollMedia, PollLayoutType, APIPollAnswer } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { resolveBuilder } from '../../util/resolveBuilder.js';\nimport { validate } from '../../util/validation.js';\nimport { pollPredicate } from './Assertions';\nimport { PollAnswerBuilder } from './PollAnswer.js';\nimport { PollQuestionBuilder } from './PollQuestion.js';\n\nexport interface PollData extends Omit<RESTAPIPoll, 'answers' | 'question'> {\n\tanswers: PollAnswerBuilder[];\n\tquestion: PollQuestionBuilder;\n}\n\n/**\n * A builder that creates API-compatible JSON data for polls.\n */\nexport class PollBuilder implements JSONEncodable<RESTAPIPoll> {\n\t/**\n\t * The API data associated with this poll.\n\t */\n\tprivate readonly data: PollData;\n\n\t/**\n\t * Gets the answers of this poll.\n\t */\n\tpublic get answers(): readonly PollAnswerBuilder[] {\n\t\treturn this.data.answers;\n\t}\n\n\t/**\n\t * Creates a new poll.\n\t *\n\t * @param data - The API data to create this poll with\n\t */\n\tpublic constructor(data: Partial<RESTAPIPoll> = {}) {\n\t\tconst { question, answers = [], ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tquestion: new PollQuestionBuilder(question),\n\t\t\tanswers: answers.map((answer) => new PollAnswerBuilder(answer)),\n\t\t};\n\t}\n\n\t/**\n\t * Appends answers to the poll.\n\t *\n\t * @remarks\n\t * This method accepts either an array of answers or a variable number of answer parameters.\n\t * The maximum amount of answers that can be added is 10.\n\t * @example\n\t * Using an array:\n\t * ```ts\n\t * const answers: APIPollMedia[] = ...;\n\t * const poll = new PollBuilder()\n\t * \t.addAnswers(answers);\n\t * ```\n\t * @example\n\t * Using rest parameters (variadic):\n\t * ```ts\n\t * const poll = new PollBuilder()\n\t * \t.addAnswers(\n\t * \t\t{ text: 'Answer 1' },\n\t * \t\t{ text: 'Answer 2' },\n\t * \t);\n\t * ```\n\t * @param answers - The answers to add\n\t */\n\tpublic addAnswers(\n\t\t...answers: RestOrArray<\n\t\t\tOmit<APIPollAnswer, 'answer_id'> | PollAnswerBuilder | ((builder: PollAnswerBuilder) => PollAnswerBuilder)\n\t\t>\n\t): this {\n\t\tconst normalizedAnswers = normalizeArray(answers);\n\t\tconst resolved = normalizedAnswers.map((answer) => resolveBuilder(answer, PollAnswerBuilder));\n\n\t\tthis.data.answers.push(...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts answers for this poll.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t * The maximum amount of answers that can be added is 10.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing answers of a poll.\n\t * @example\n\t * Remove the first answer:\n\t * ```ts\n\t * poll.spliceAnswers(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n answers:\n\t * ```ts\n\t * const n = 4;\n\t * poll.spliceAnswers(0, n);\n\t * ```\n\t * @example\n\t * Remove the last answer:\n\t * ```ts\n\t * poll.spliceAnswers(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of answers to remove\n\t * @param answers - The replacing answer objects\n\t */\n\tpublic spliceAnswers(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...answers: (\n\t\t\t| Omit<APIPollAnswer, 'answer_id'>\n\t\t\t| PollAnswerBuilder\n\t\t\t| ((builder: PollAnswerBuilder) => PollAnswerBuilder)\n\t\t)[]\n\t): this {\n\t\tconst normalizedAnswers = normalizeArray(answers);\n\t\tconst resolved = normalizedAnswers.map((answer) => resolveBuilder(answer, PollAnswerBuilder));\n\n\t\tthis.data.answers.splice(index, deleteCount, ...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the answers for this poll.\n\t *\n\t * @remarks\n\t * This method is an alias for {@link PollBuilder.spliceAnswers}. More specifically,\n\t * it splices the entire array of answers, replacing them with the provided answers.\n\t *\n\t * You can set a maximum of 10 answers.\n\t * @param answers - The answers to set\n\t */\n\tpublic setAnswers(\n\t\t...answers: RestOrArray<\n\t\t\tOmit<APIPollAnswer, 'answer_id'> | PollAnswerBuilder | ((builder: PollAnswerBuilder) => PollAnswerBuilder)\n\t\t>\n\t): this {\n\t\treturn this.spliceAnswers(0, this.data.answers.length, ...normalizeArray(answers));\n\t}\n\n\t/**\n\t * Sets the question for this poll.\n\t *\n\t * @param options - The data to use for this poll's question\n\t */\n\tpublic setQuestion(\n\t\toptions:\n\t\t\t| Omit<APIPollMedia, 'emoji'>\n\t\t\t| PollQuestionBuilder\n\t\t\t| ((builder: PollQuestionBuilder) => PollQuestionBuilder),\n\t): this {\n\t\tthis.data.question = resolveBuilder(options, PollQuestionBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the question of this poll.\n\t *\n\t * @param updater - The function to update the question with\n\t */\n\tpublic updateQuestion(updater: (builder: PollQuestionBuilder) => void): this {\n\t\tupdater(this.data.question);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the layout type for this poll.\n\t *\n\t * @remarks\n\t * This method is redundant while only one type of poll layout exists (`PollLayoutType.Default`)\n\t * with Discord using that as the layout type if none is specified.\n\t * @param type - The type of poll layout to use\n\t */\n\tpublic setLayoutType(type: PollLayoutType): this {\n\t\tthis.data.layout_type = type;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the layout type for this poll.\n\t */\n\tpublic clearLayoutType(): this {\n\t\tthis.data.layout_type = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether multi-select is enabled for this poll.\n\t *\n\t * @param multiSelect - Whether to allow multi-select\n\t */\n\tpublic setMultiSelect(multiSelect = true): this {\n\t\tthis.data.allow_multiselect = multiSelect;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets how long this poll will be open for in hours.\n\t *\n\t * @remarks\n\t * Minimum duration is `1`, with maximum duration being `768` (32 days).\n\t * Default if none specified is `24` (one day).\n\t * @param duration - The amount of hours this poll will be open for\n\t */\n\tpublic setDuration(duration: number): this {\n\t\tthis.data.duration = duration;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the duration for this poll.\n\t */\n\tpublic clearDuration(): this {\n\t\tthis.data.duration = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): RESTAPIPoll {\n\t\tconst { answers, question, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\t// Disable validation because the pollPredicate below will validate those as well\n\t\t\tanswers: answers.map((answer) => answer.toJSON(false)),\n\t\t\tquestion: question.toJSON(false),\n\t\t};\n\n\t\tvalidate(pollPredicate, data, validationOverride);\n\n\t\treturn data;\n\t}\n}\n","import { Buffer } from 'node:buffer';\nimport { AllowedMentionsTypes, ComponentType, MessageFlags, MessageReferenceType } from 'discord-api-types/v10';\nimport { z } from 'zod';\nimport { snowflakePredicate } from '../Assertions.js';\nimport { embedPredicate } from './embed/Assertions.js';\nimport { pollPredicate } from './poll/Assertions.js';\n\nconst fileKeyRegex = /^files\\[(?<placeholder>\\d+?)]$/;\n\nexport const rawFilePredicate = z.object({\n\tdata: z.union([z.instanceof(Buffer), z.instanceof(Uint8Array), z.string()]),\n\tname: z.string().min(1),\n\tcontentType: z.string().optional(),\n\tkey: z.string().regex(fileKeyRegex).optional(),\n});\n\nexport const attachmentPredicate = z.object({\n\t// As a string it only makes sense for edits when we do have an attachment snowflake\n\tid: z.union([snowflakePredicate, z.number()]),\n\tdescription: z.string().max(1_024).optional(),\n\tduration_secs: z\n\t\t.number()\n\t\t.max(2 ** 31 - 1)\n\t\t.optional(),\n\tfilename: z.string().max(1_024).optional(),\n\ttitle: z.string().max(1_024).optional(),\n\twaveform: z.string().max(400).optional(),\n});\n\nexport const allowedMentionPredicate = z\n\t.object({\n\t\tparse: z.enum(AllowedMentionsTypes).array().optional(),\n\t\troles: z.string().array().max(100).optional(),\n\t\tusers: z.string().array().max(100).optional(),\n\t\treplied_user: z.boolean().optional(),\n\t})\n\t.refine(\n\t\t(data) =>\n\t\t\t!(\n\t\t\t\t(data.parse?.includes(AllowedMentionsTypes.User) && data.users?.length) ||\n\t\t\t\t(data.parse?.includes(AllowedMentionsTypes.Role) && data.roles?.length)\n\t\t\t),\n\t\t{\n\t\t\terror:\n\t\t\t\t'Cannot specify both parse: [\"users\"] and non-empty users array, or parse: [\"roles\"] and non-empty roles array. These are mutually exclusive',\n\t\t},\n\t);\n\nexport const messageReferencePredicate = z.object({\n\tchannel_id: z.string().optional(),\n\tfail_if_not_exists: z.boolean().optional(),\n\tguild_id: z.string().optional(),\n\tmessage_id: z.string(),\n\ttype: z.enum(MessageReferenceType).optional(),\n});\n\nconst baseMessagePredicate = z.object({\n\tnonce: z.union([z.string().max(25), z.number()]).optional(),\n\ttts: z.boolean().optional(),\n\tallowed_mentions: allowedMentionPredicate.optional(),\n\tmessage_reference: messageReferencePredicate.optional(),\n\tattachments: attachmentPredicate.array().max(10).optional(),\n\tenforce_nonce: z.boolean().optional(),\n});\n\nconst basicActionRowPredicate = z.object({\n\ttype: z.literal(ComponentType.ActionRow),\n\tcomponents: z\n\t\t.object({\n\t\t\ttype: z.literal([\n\t\t\t\tComponentType.Button,\n\t\t\t\tComponentType.ChannelSelect,\n\t\t\t\tComponentType.MentionableSelect,\n\t\t\t\tComponentType.RoleSelect,\n\t\t\t\tComponentType.StringSelect,\n\t\t\t\tComponentType.UserSelect,\n\t\t\t]),\n\t\t})\n\t\t.array(),\n});\n\nconst messageNoComponentsV2Predicate = baseMessagePredicate\n\t.extend({\n\t\tcontent: z.string().max(2_000).optional(),\n\t\tembeds: embedPredicate.array().max(10).optional(),\n\t\tsticker_ids: z.array(z.string()).max(3).optional(),\n\t\tpoll: pollPredicate.optional(),\n\t\tcomponents: basicActionRowPredicate.array().max(5).optional(),\n\t\tflags: z\n\t\t\t.int()\n\t\t\t.optional()\n\t\t\t.refine((flags) => !flags || (flags & MessageFlags.IsComponentsV2) === 0, {\n\t\t\t\terror: 'Cannot set content, embeds, stickers, or poll with IsComponentsV2 flag set',\n\t\t\t}),\n\t})\n\t.refine(\n\t\t(data) =>\n\t\t\tdata.content !== undefined ||\n\t\t\t(data.embeds !== undefined && data.embeds.length > 0) ||\n\t\t\tdata.poll !== undefined ||\n\t\t\t(data.attachments !== undefined && data.attachments.length > 0) ||\n\t\t\t(data.components !== undefined && data.components.length > 0) ||\n\t\t\t(data.sticker_ids !== undefined && data.sticker_ids.length > 0),\n\t\t{ error: 'Messages must have content, embeds, a poll, attachments, components or stickers' },\n\t);\n\nconst allTopLevelComponentsPredicate = z\n\t.union([\n\t\tbasicActionRowPredicate,\n\t\tz.object({\n\t\t\ttype: z.literal([\n\t\t\t\t// Components v2\n\t\t\t\tComponentType.Container,\n\t\t\t\tComponentType.File,\n\t\t\t\tComponentType.MediaGallery,\n\t\t\t\tComponentType.Section,\n\t\t\t\tComponentType.Separator,\n\t\t\t\tComponentType.TextDisplay,\n\t\t\t\tComponentType.Thumbnail,\n\t\t\t]),\n\t\t}),\n\t])\n\t.array()\n\t.min(1)\n\t.max(10);\n\nconst messageComponentsV2Predicate = baseMessagePredicate.extend({\n\tcomponents: allTopLevelComponentsPredicate,\n\tflags: z.int().refine((flags) => (flags & MessageFlags.IsComponentsV2) === MessageFlags.IsComponentsV2, {\n\t\terror: 'Must set IsComponentsV2 flag to use Components V2',\n\t}),\n\t// These fields cannot be set\n\tcontent: z.string().length(0).nullish(),\n\tembeds: z.array(z.never()).nullish(),\n\tsticker_ids: z.array(z.never()).nullish(),\n\tpoll: z.null().optional(),\n});\n\nexport const messagePredicate = z.union([messageNoComponentsV2Predicate, messageComponentsV2Predicate]);\n\n// This validator does not assert file.key <-> attachment.id coherence. This is fine, because the builders\n// should effectively guarantee that.\nexport const fileBodyMessagePredicate = z.object({\n\tbody: messagePredicate,\n\t// No min length to support message edits\n\tfiles: rawFilePredicate.array().max(10),\n});\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { AllowedMentionsTypes, APIAllowedMentions, Snowflake } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../util/normalizeArray.js';\nimport { validate } from '../util/validation.js';\nimport { allowedMentionPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for allowed mentions.\n */\nexport class AllowedMentionsBuilder implements JSONEncodable<APIAllowedMentions> {\n\t/**\n\t * The API data associated with these allowed mentions.\n\t */\n\tprivate readonly data: Partial<APIAllowedMentions>;\n\n\t/**\n\t * Creates a new allowed mentions builder.\n\t *\n\t * @param data - The API data to create this allowed mentions with\n\t */\n\tpublic constructor(data: Partial<APIAllowedMentions> = {}) {\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * Sets the types of mentions to parse from the content.\n\t *\n\t * @param parse - The types of mentions to parse from the content\n\t */\n\tpublic setParse(...parse: RestOrArray<AllowedMentionsTypes>): this {\n\t\tthis.data.parse = normalizeArray(parse);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the parse mention types.\n\t */\n\tpublic clearParse(): this {\n\t\tthis.data.parse = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the roles to mention.\n\t *\n\t * @param roles - The roles to mention\n\t */\n\tpublic setRoles(...roles: RestOrArray<Snowflake>): this {\n\t\tthis.data.roles = normalizeArray(roles);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds roles to mention.\n\t *\n\t * @param roles - The roles to mention\n\t */\n\tpublic addRoles(...roles: RestOrArray<Snowflake>): this {\n\t\tthis.data.roles ??= [];\n\t\tthis.data.roles.push(...normalizeArray(roles));\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts roles.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing roles.\n\t * @example\n\t * Remove the first role:\n\t * ```ts\n\t * allowedMentions.spliceRoles(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n roles:\n\t * ```ts\n\t * const n = 4;\n\t * allowedMentions.spliceRoles(0, n);\n\t * ```\n\t * @example\n\t * Remove the last role:\n\t * ```ts\n\t * allowedMentions.spliceRoles(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of roles to remove\n\t * @param roles - The replacing role ids\n\t */\n\tpublic spliceRoles(index: number, deleteCount: number, ...roles: RestOrArray<Snowflake>): this {\n\t\tthis.data.roles ??= [];\n\t\tthis.data.roles.splice(index, deleteCount, ...normalizeArray(roles));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the roles to mention.\n\t */\n\tpublic clearRoles(): this {\n\t\tthis.data.roles = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the users to mention.\n\t *\n\t * @param users - The users to mention\n\t */\n\tpublic setUsers(...users: RestOrArray<Snowflake>): this {\n\t\tthis.data.users = normalizeArray(users);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds users to mention.\n\t *\n\t * @param users - The users to mention\n\t */\n\tpublic addUsers(...users: RestOrArray<Snowflake>): this {\n\t\tthis.data.users ??= [];\n\t\tthis.data.users.push(...normalizeArray(users));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts users.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing users.\n\t * @example\n\t * Remove the first user:\n\t * ```ts\n\t * allowedMentions.spliceUsers(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n users:\n\t * ```ts\n\t * const n = 4;\n\t * allowedMentions.spliceUsers(0, n);\n\t * ```\n\t * @example\n\t * Remove the last user:\n\t * ```ts\n\t * allowedMentions.spliceUsers(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of users to remove\n\t * @param users - The replacing user ids\n\t */\n\tpublic spliceUsers(index: number, deleteCount: number, ...users: RestOrArray<Snowflake>): this {\n\t\tthis.data.users ??= [];\n\t\tthis.data.users.splice(index, deleteCount, ...normalizeArray(users));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the users to mention.\n\t */\n\tpublic clearUsers(): this {\n\t\tthis.data.users = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * For replies, sets whether to mention the author of the message being replied to.\n\t *\n\t * @param repliedUser - Whether to mention the author of the message being replied to\n\t */\n\tpublic setRepliedUser(repliedUser = true): this {\n\t\tthis.data.replied_user = repliedUser;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): APIAllowedMentions {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(allowedMentionPredicate, clone, validationOverride);\n\n\t\treturn clone as APIAllowedMentions;\n\t}\n}\n","import type { Buffer } from 'node:buffer';\nimport type { JSONEncodable, RawFile } from '@discordjs/util';\nimport type { RESTAPIAttachment, Snowflake } from 'discord-api-types/v10';\nimport { validate } from '../util/validation.js';\nimport { attachmentPredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for attachments.\n */\nexport class AttachmentBuilder implements JSONEncodable<RESTAPIAttachment> {\n\t/**\n\t * The API data associated with this attachment.\n\t */\n\tprivate readonly data: Partial<RESTAPIAttachment>;\n\n\t/**\n\t * This data is not included in the output of `toJSON()`. For this class specifically, this refers to binary data\n\t * that will wind up being included in the multipart/form-data request, if used with the `MessageBuilder`.\n\t * To retrieve this data, use {@link getRawFile}.\n\t *\n\t * @remarks This cannot be set via the constructor, primarily because of the behavior described\n\t * {@link https://discord.com/developers/docs/reference#editing-message-attachments | here}.\n\t * That is, when editing a message's attachments, you should only be providing file data for new attachments.\n\t */\n\tprivate readonly fileData: Partial<Pick<RawFile, 'contentType' | 'data'>>;\n\n\t/**\n\t * Creates a new attachment builder.\n\t *\n\t * @param data - The API data to create this attachment with\n\t * @example\n\t * ```ts\n\t * const attachment = new AttachmentBuilder().setId(1).setFileData(':)').setFilename('smiley.txt')\n\t * ```\n\t * @remarks Please note that the `id` field is required, it's rather easy to miss!\n\t */\n\tpublic constructor(data: Partial<RESTAPIAttachment> = {}) {\n\t\tthis.data = structuredClone(data);\n\t\tthis.fileData = {};\n\t}\n\n\t/**\n\t * Sets the id of the attachment.\n\t *\n\t * @param id - The id of the attachment\n\t */\n\tpublic setId(id: Snowflake | number): this {\n\t\tthis.data.id = id;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this attachment.\n\t *\n\t * @param description - The description of the attachment\n\t */\n\tpublic setDescription(description: string): this {\n\t\tthis.data.description = description;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the description of this attachment.\n\t */\n\tpublic clearDescription(): this {\n\t\tthis.data.description = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the duration of this attachment (audio clips).\n\t *\n\t * @param duration - The duration of the attachment in seconds\n\t */\n\tpublic setDuration(duration: number): this {\n\t\tthis.data.duration_secs = duration;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the duration of this attachment.\n\t */\n\tpublic clearDuration(): this {\n\t\tthis.data.duration_secs = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the filename of this attachment.\n\t *\n\t * @param filename - The filename of the attachment\n\t */\n\tpublic setFilename(filename: string): this {\n\t\tthis.data.filename = filename;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the filename of this attachment.\n\t */\n\tpublic clearFilename(): this {\n\t\tthis.data.filename = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the file data to upload with this attachment.\n\t *\n\t * @param data - The file data\n\t * @remarks Note that this data is NOT included in the {@link toJSON} output. To retrieve it, use {@link getRawFile}.\n\t */\n\tpublic setFileData(data: Buffer | Uint8Array | string): this {\n\t\tthis.fileData.data = data;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the file data from this attachment.\n\t */\n\tpublic clearFileData(): this {\n\t\tthis.fileData.data = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the content type of the file data to upload with this attachment.\n\t *\n\t * @remarks Note that this data is NOT included in the {@link toJSON} output. To retrieve it, use {@link getRawFile}.\n\t */\n\tpublic setFileContentType(contentType: string): this {\n\t\tthis.fileData.contentType = contentType;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the content type of the file data from this attachment.\n\t */\n\tpublic clearFileContentType(): this {\n\t\tthis.fileData.contentType = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Converts this attachment to a {@link RawFile} for uploading.\n\t *\n\t * @returns A {@link RawFile} object, or `undefined` if no file data is set\n\t */\n\tpublic getRawFile(): Partial<RawFile> | undefined {\n\t\tif (!this.fileData?.data) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn {\n\t\t\t...this.fileData,\n\t\t\tname: this.data.filename,\n\t\t\tkey: this.data.id === undefined ? undefined : `files[${this.data.id}]`,\n\t\t};\n\t}\n\n\t/**\n\t * Sets the title of this attachment.\n\t *\n\t * @param title - The title of the attachment\n\t */\n\tpublic setTitle(title: string): this {\n\t\tthis.data.title = title;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the title of this attachment.\n\t */\n\tpublic clearTitle(): this {\n\t\tthis.data.title = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the waveform of this attachment (audio clips).\n\t *\n\t * @param waveform - The waveform of the attachment\n\t */\n\tpublic setWaveform(waveform: string): this {\n\t\tthis.data.waveform = waveform;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the waveform of this attachment.\n\t */\n\tpublic clearWaveform(): this {\n\t\tthis.data.waveform = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): RESTAPIAttachment {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(attachmentPredicate, clone, validationOverride);\n\n\t\treturn clone as RESTAPIAttachment;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { MessageReferenceType, RESTAPIMessageReference, Snowflake } from 'discord-api-types/v10';\nimport { validate } from '../util/validation.js';\nimport { messageReferencePredicate } from './Assertions.js';\n\n/**\n * A builder that creates API-compatible JSON data for message references.\n */\nexport class MessageReferenceBuilder implements JSONEncodable<RESTAPIMessageReference> {\n\t/**\n\t * The API data associated with this message reference.\n\t */\n\tprivate readonly data: Partial<RESTAPIMessageReference>;\n\n\t/**\n\t * Creates a new message reference builder.\n\t *\n\t * @param data - The API data to create this message reference with\n\t */\n\tpublic constructor(data: Partial<RESTAPIMessageReference> = {}) {\n\t\tthis.data = structuredClone(data);\n\t}\n\n\t/**\n\t * Sets the type of message reference this represents\n\t *\n\t * @param type - The type of message reference\n\t */\n\tpublic setType(type: MessageReferenceType): this {\n\t\tthis.data.type = type;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clear the type of message reference this represents\n\t */\n\tpublic clearType(): this {\n\t\tthis.data.type = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the id of the message being referenced\n\t *\n\t * @param messageId - The id of the message being referenced\n\t */\n\tpublic setMessageId(messageId: Snowflake): this {\n\t\tthis.data.message_id = messageId;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the id of the channel being referenced\n\t *\n\t * @param channelId - The id of the channel being referenced\n\t */\n\tpublic setChannelId(channelId: Snowflake): this {\n\t\tthis.data.channel_id = channelId;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clear the id of the channel being referenced\n\t */\n\tpublic clearChannelId(): this {\n\t\tthis.data.channel_id = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the id of the guild being referenced\n\t *\n\t * @param guildId - The id of the guild being referenced\n\t */\n\tpublic setGuildId(guildId: Snowflake): this {\n\t\tthis.data.guild_id = guildId;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clear the id of the guild being referenced\n\t */\n\tpublic clearGuildId(): this {\n\t\tthis.data.guild_id = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether to fail the message creation if the referenced message does not exist\n\t *\n\t * @param failIfNotExists - Whether to fail the message creation if the referenced message does not exist\n\t */\n\tpublic setFailIfNotExists(failIfNotExists = true): this {\n\t\tthis.data.fail_if_not_exists = failIfNotExists;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): RESTAPIMessageReference {\n\t\tconst clone = structuredClone(this.data);\n\t\tvalidate(messageReferencePredicate, clone, validationOverride);\n\n\t\treturn clone as RESTAPIMessageReference;\n\t}\n}\n","import type { FileBodyEncodable, FileBodyEncodableResult, JSONEncodable, RawFile } from '@discordjs/util';\nimport type {\n\tAPIActionRowComponent,\n\tAPIAllowedMentions,\n\tAPIAttachment,\n\tAPIEmbed,\n\tAPIComponentInMessageActionRow,\n\tAPIMessageReference,\n\tAPIPoll,\n\tRESTPostAPIChannelMessageJSONBody,\n\tSnowflake,\n\tMessageFlags,\n\tAPIContainerComponent,\n\tAPIFileComponent,\n\tAPIMediaGalleryComponent,\n\tAPISectionComponent,\n\tAPISeparatorComponent,\n\tAPITextDisplayComponent,\n\tAPIMessageTopLevelComponent,\n} from 'discord-api-types/v10';\nimport { ActionRowBuilder } from '../components/ActionRow.js';\nimport { ComponentBuilder } from '../components/Component.js';\nimport type { MessageTopLevelComponentBuilder } from '../components/Components.js';\nimport { createComponentBuilder } from '../components/Components.js';\nimport { ContainerBuilder } from '../components/v2/Container.js';\nimport { FileBuilder } from '../components/v2/File.js';\nimport { MediaGalleryBuilder } from '../components/v2/MediaGallery.js';\nimport { SectionBuilder } from '../components/v2/Section.js';\nimport { SeparatorBuilder } from '../components/v2/Separator.js';\nimport { TextDisplayBuilder } from '../components/v2/TextDisplay.js';\nimport { normalizeArray, type RestOrArray } from '../util/normalizeArray.js';\nimport { resolveBuilder } from '../util/resolveBuilder.js';\nimport { validate } from '../util/validation.js';\nimport { AllowedMentionsBuilder } from './AllowedMentions.js';\nimport { fileBodyMessagePredicate, messagePredicate } from './Assertions.js';\nimport { AttachmentBuilder } from './Attachment.js';\nimport { MessageReferenceBuilder } from './MessageReference.js';\nimport { EmbedBuilder } from './embed/Embed.js';\nimport { PollBuilder } from './poll/Poll.js';\n\nexport interface MessageBuilderData extends Partial<\n\tOmit<\n\t\tRESTPostAPIChannelMessageJSONBody,\n\t\t'allowed_mentions' | 'attachments' | 'components' | 'embeds' | 'message_reference' | 'poll'\n\t>\n> {\n\tallowed_mentions?: AllowedMentionsBuilder;\n\tattachments: AttachmentBuilder[];\n\tcomponents: MessageTopLevelComponentBuilder[];\n\tembeds: EmbedBuilder[];\n\tmessage_reference?: MessageReferenceBuilder;\n\tpoll?: PollBuilder;\n}\n\n/**\n * A builder that creates API-compatible JSON data for messages.\n */\nexport class MessageBuilder\n\timplements JSONEncodable<RESTPostAPIChannelMessageJSONBody>, FileBodyEncodable<RESTPostAPIChannelMessageJSONBody>\n{\n\t/**\n\t * The API data associated with this message.\n\t */\n\tprivate readonly data: MessageBuilderData;\n\n\t/**\n\t * Gets the attachments of this message.\n\t */\n\tpublic get attachments(): readonly AttachmentBuilder[] {\n\t\treturn this.data.attachments;\n\t}\n\n\t/**\n\t * Gets the components of this message.\n\t */\n\tpublic get components(): readonly MessageTopLevelComponentBuilder[] {\n\t\treturn this.data.components;\n\t}\n\n\t/**\n\t * Gets the embeds of this message.\n\t */\n\tpublic get embeds(): readonly EmbedBuilder[] {\n\t\treturn this.data.embeds;\n\t}\n\n\t/**\n\t * Creates a new message builder.\n\t *\n\t * @param data - The API data to create this message with\n\t */\n\tpublic constructor(data: Partial<RESTPostAPIChannelMessageJSONBody> = {}) {\n\t\tconst { attachments = [], embeds = [], components = [], message_reference, poll, allowed_mentions, ...rest } = data;\n\n\t\tthis.data = {\n\t\t\t...structuredClone(rest),\n\t\t\tallowed_mentions: allowed_mentions && new AllowedMentionsBuilder(allowed_mentions),\n\t\t\tattachments: attachments.map((attachment) => new AttachmentBuilder(attachment)),\n\t\t\tembeds: embeds.map((embed) => new EmbedBuilder(embed)),\n\t\t\tpoll: poll && new PollBuilder(poll),\n\t\t\tcomponents: components.map((component) => createComponentBuilder(component)),\n\t\t\tmessage_reference: message_reference && new MessageReferenceBuilder(message_reference),\n\t\t};\n\t}\n\n\t/**\n\t * Sets the content of the message.\n\t *\n\t * @param content - The content to set\n\t */\n\tpublic setContent(content: string): this {\n\t\tthis.data.content = content;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the content of the message.\n\t */\n\tpublic clearContent(): this {\n\t\tthis.data.content = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the nonce of the message.\n\t *\n\t * @param nonce - The nonce to set\n\t */\n\tpublic setNonce(nonce: number | string): this {\n\t\tthis.data.nonce = nonce;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the nonce of the message.\n\t */\n\tpublic clearNonce(): this {\n\t\tthis.data.nonce = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether the message is TTS.\n\t *\n\t * @param tts - Whether the message is TTS\n\t */\n\tpublic setTTS(tts = true): this {\n\t\tthis.data.tts = tts;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Appends embeds to this message.\n\t *\n\t * @remarks\n\t * The maximum amount of embeds that can be added is 10.\n\t * @example\n\t * Using an array:\n\t * ```ts\n\t * const embeds: APIEmbed[] = ...;\n\t * const message = new MessageBuilder()\n\t * \t.addEmbeds(embeds);\n\t * ```\n\t * @example\n\t * Using rest parameters (variadic):\n\t * ```ts\n\t * const message = new MessageBuilder()\n\t * \t.addEmbeds(\n\t * \t\t{ title: 'Embed 1' },\n\t * \t\t{ title: 'Embed 2' },\n\t * \t);\n\t * ```\n\t * @param embeds - The embeds to add\n\t */\n\tpublic addEmbeds(...embeds: RestOrArray<APIEmbed | EmbedBuilder | ((builder: EmbedBuilder) => EmbedBuilder)>): this {\n\t\tthis.data.embeds ??= [];\n\n\t\tconst resolved = normalizeArray(embeds).map((embed) => resolveBuilder(embed, EmbedBuilder));\n\t\tthis.data.embeds.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts embeds for this message.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing embeds of a message.\n\t * @example\n\t * Remove the first embed:\n\t * ```ts\n\t * message.spliceEmbeds(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n embeds:\n\t * ```ts\n\t * const n = 4;\n\t * message.spliceEmbeds(0, n);\n\t * ```\n\t * @example\n\t * Remove the last embed:\n\t * ```ts\n\t * message.spliceEmbeds(-1, 1);\n\t * ```\n\t * @param start - The index to start at\n\t * @param deleteCount - The amount of embeds to remove\n\t * @param embeds - The embeds to insert\n\t */\n\tpublic spliceEmbeds(\n\t\tstart: number,\n\t\tdeleteCount: number,\n\t\t...embeds: RestOrArray<APIEmbed | EmbedBuilder | ((builder: EmbedBuilder) => EmbedBuilder)>\n\t): this {\n\t\tthis.data.embeds ??= [];\n\t\tconst resolved = normalizeArray(embeds).map((embed) => resolveBuilder(embed, EmbedBuilder));\n\n\t\tthis.data.embeds.splice(start, deleteCount, ...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the embeds for this message.\n\t *\n\t * @param embeds - The embeds to set\n\t */\n\tpublic setEmbeds(...embeds: RestOrArray<APIEmbed | EmbedBuilder | ((builder: EmbedBuilder) => EmbedBuilder)>): this {\n\t\treturn this.spliceEmbeds(0, this.embeds.length, ...normalizeArray(embeds));\n\t}\n\n\t/**\n\t * Sets the allowed mentions for this message.\n\t *\n\t * @param allowedMentions - The allowed mentions to set\n\t */\n\tpublic setAllowedMentions(\n\t\tallowedMentions:\n\t\t\t| AllowedMentionsBuilder\n\t\t\t| APIAllowedMentions\n\t\t\t| ((builder: AllowedMentionsBuilder) => AllowedMentionsBuilder) = new AllowedMentionsBuilder(),\n\t): this {\n\t\tthis.data.allowed_mentions = resolveBuilder(allowedMentions, AllowedMentionsBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the allowed mentions for this message (and creates it if it doesn't exist)\n\t *\n\t * @param updater - The function to update the allowed mentions with\n\t */\n\tpublic updateAllowedMentions(updater: (builder: AllowedMentionsBuilder) => void): this {\n\t\tupdater((this.data.allowed_mentions ??= new AllowedMentionsBuilder()));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the allowed mentions for this message.\n\t */\n\tpublic clearAllowedMentions(): this {\n\t\tthis.data.allowed_mentions = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the message reference for this message.\n\t *\n\t * @param reference - The reference to set\n\t */\n\tpublic setMessageReference(\n\t\treference:\n\t\t\t| APIMessageReference\n\t\t\t| MessageReferenceBuilder\n\t\t\t| ((builder: MessageReferenceBuilder) => MessageReferenceBuilder),\n\t): this {\n\t\tthis.data.message_reference = resolveBuilder(reference, MessageReferenceBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the message reference for this message (and creates it if it doesn't exist)\n\t *\n\t * @param updater - The function to update the message reference with\n\t */\n\tpublic updateMessageReference(updater: (builder: MessageReferenceBuilder) => void): this {\n\t\tupdater((this.data.message_reference ??= new MessageReferenceBuilder()));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the message reference for this message.\n\t */\n\tpublic clearMessageReference(): this {\n\t\tthis.data.message_reference = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds action row components to this message.\n\t *\n\t * @param components - The action row components to add\n\t */\n\tpublic addActionRowComponents(\n\t\t...components: RestOrArray<\n\t\t\t| ActionRowBuilder\n\t\t\t| APIActionRowComponent<APIComponentInMessageActionRow>\n\t\t\t| ((builder: ActionRowBuilder) => ActionRowBuilder)\n\t\t>\n\t): this {\n\t\tthis.data.components ??= [];\n\n\t\tconst resolved = normalizeArray(components).map((component) => resolveBuilder(component, ActionRowBuilder));\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds container components to this message.\n\t *\n\t * @param components - The container components to add\n\t */\n\tpublic addContainerComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPIContainerComponent | ContainerBuilder | ((builder: ContainerBuilder) => ContainerBuilder)\n\t\t>\n\t): this {\n\t\tthis.data.components ??= [];\n\n\t\tconst resolved = normalizeArray(components).map((component) => resolveBuilder(component, ContainerBuilder));\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds file components to this message.\n\t *\n\t * @param components - The file components to add\n\t */\n\tpublic addFileComponents(\n\t\t...components: RestOrArray<APIFileComponent | FileBuilder | ((builder: FileBuilder) => FileBuilder)>\n\t): this {\n\t\tthis.data.components ??= [];\n\n\t\tconst resolved = normalizeArray(components).map((component) => resolveBuilder(component, FileBuilder));\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds media gallery components to this message.\n\t *\n\t * @param components - The media gallery components to add\n\t */\n\tpublic addMediaGalleryComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPIMediaGalleryComponent | MediaGalleryBuilder | ((builder: MediaGalleryBuilder) => MediaGalleryBuilder)\n\t\t>\n\t): this {\n\t\tthis.data.components ??= [];\n\n\t\tconst resolved = normalizeArray(components).map((component) => resolveBuilder(component, MediaGalleryBuilder));\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds section components to this message.\n\t *\n\t * @param components - The section components to add\n\t */\n\tpublic addSectionComponents(\n\t\t...components: RestOrArray<APISectionComponent | SectionBuilder | ((builder: SectionBuilder) => SectionBuilder)>\n\t): this {\n\t\tthis.data.components ??= [];\n\n\t\tconst resolved = normalizeArray(components).map((component) => resolveBuilder(component, SectionBuilder));\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds separator components to this message.\n\t *\n\t * @param components - The separator components to add\n\t */\n\tpublic addSeparatorComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPISeparatorComponent | SeparatorBuilder | ((builder: SeparatorBuilder) => SeparatorBuilder)\n\t\t>\n\t): this {\n\t\tthis.data.components ??= [];\n\n\t\tconst resolved = normalizeArray(components).map((component) => resolveBuilder(component, SeparatorBuilder));\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds text display components to this message.\n\t *\n\t * @param components - The text display components to add\n\t */\n\tpublic addTextDisplayComponents(\n\t\t...components: RestOrArray<\n\t\t\tAPITextDisplayComponent | TextDisplayBuilder | ((builder: TextDisplayBuilder) => TextDisplayBuilder)\n\t\t>\n\t): this {\n\t\tthis.data.components ??= [];\n\n\t\tconst resolved = normalizeArray(components).map((component) => resolveBuilder(component, TextDisplayBuilder));\n\t\tthis.data.components.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts components for this message.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing components of a message.\n\t * @example\n\t * Remove the first component:\n\t * ```ts\n\t * message.spliceComponents(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n components:\n\t * ```ts\n\t * const n = 4;\n\t * message.spliceComponents(0, n);\n\t * ```\n\t * @example\n\t * Remove the last component:\n\t * ```ts\n\t * message.spliceComponents(-1, 1);\n\t * ```\n\t * @param start - The index to start at\n\t * @param deleteCount - The amount of components to remove\n\t * @param components - The components to insert\n\t */\n\tpublic spliceComponents(\n\t\tstart: number,\n\t\tdeleteCount: number,\n\t\t...components: RestOrArray<APIMessageTopLevelComponent | MessageTopLevelComponentBuilder>\n\t): this {\n\t\tthis.data.components ??= [];\n\t\tconst resolved = normalizeArray(components).map((component) =>\n\t\t\tcomponent instanceof ComponentBuilder ? component : createComponentBuilder(component),\n\t\t);\n\n\t\tthis.data.components.splice(start, deleteCount, ...resolved);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the sticker ids of this message.\n\t *\n\t * @param stickerIds - The ids of the stickers to set\n\t */\n\tpublic setStickerIds(...stickerIds: RestOrArray<Snowflake>): this {\n\t\treturn this.spliceStickerIds(0, this.data.sticker_ids?.length ?? 0, ...normalizeArray(stickerIds));\n\t}\n\n\t/**\n\t * Adds sticker ids to this message.\n\t *\n\t * @param stickerIds - The ids of the stickers to add\n\t */\n\tpublic addStickerIds(...stickerIds: RestOrArray<Snowflake>): this {\n\t\tthis.data.sticker_ids ??= [] as unknown as MessageBuilderData['sticker_ids'];\n\t\tthis.data.sticker_ids!.push(...normalizeArray(stickerIds));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts sticker ids for this message.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing sticker ids of a message.\n\t * @example\n\t * Remove the first sticker id:\n\t * ```ts\n\t * message.spliceStickerIds(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n sticker ids:\n\t * ```ts\n\t * const n = 4;\n\t * message.spliceStickerIds(0, n);\n\t * ```\n\t * @example\n\t * Remove the last sticker id:\n\t * ```ts\n\t * message.spliceStickerIds(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The amount of sticker ids to remove\n\t * @param stickerIds - The sticker ids to insert\n\t */\n\tpublic spliceStickerIds(index: number, deleteCount: number, ...stickerIds: RestOrArray<Snowflake>): this {\n\t\tthis.data.sticker_ids ??= [] as unknown as MessageBuilderData['sticker_ids'];\n\t\tthis.data.sticker_ids!.splice(index, deleteCount, ...normalizeArray(stickerIds));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets attachments for this message.\n\t *\n\t * @param attachments - The attachments to set\n\t */\n\tpublic setAttachments(\n\t\t...attachments: RestOrArray<APIAttachment | AttachmentBuilder | ((builder: AttachmentBuilder) => AttachmentBuilder)>\n\t): this {\n\t\treturn this.spliceAttachments(0, this.data.attachments.length, ...normalizeArray(attachments));\n\t}\n\n\t/**\n\t * Adds attachments to this message.\n\t *\n\t * @param attachments - The attachments to add\n\t */\n\tpublic addAttachments(\n\t\t...attachments: RestOrArray<APIAttachment | AttachmentBuilder | ((builder: AttachmentBuilder) => AttachmentBuilder)>\n\t): this {\n\t\tconst resolved = normalizeArray(attachments).map((attachment) => resolveBuilder(attachment, AttachmentBuilder));\n\t\tthis.data.attachments.push(...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts attachments for this message.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice()}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing attachments of a message.\n\t * @example\n\t * Remove the first attachment:\n\t * ```ts\n\t * message.spliceAttachments(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n attachments:\n\t * ```ts\n\t * const n = 4;\n\t * message.spliceAttachments(0, n);\n\t * ```\n\t * @example\n\t * Remove the last attachment:\n\t * ```ts\n\t * message.spliceAttachments(-1, 1);\n\t * ```\n\t * @param start - The index to start at\n\t * @param deleteCount - The amount of attachments to remove\n\t * @param attachments - The attachments to insert\n\t */\n\tpublic spliceAttachments(\n\t\tstart: number,\n\t\tdeleteCount: number,\n\t\t...attachments: RestOrArray<APIAttachment | AttachmentBuilder | ((builder: AttachmentBuilder) => AttachmentBuilder)>\n\t): this {\n\t\tconst resolved = normalizeArray(attachments).map((attachment) => resolveBuilder(attachment, AttachmentBuilder));\n\t\tthis.data.attachments.splice(start, deleteCount, ...resolved);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the flags for this message.\n\t *\n\t * @param flags - The flags to set\n\t */\n\tpublic setFlags(flags: MessageFlags): this {\n\t\tthis.data.flags = flags;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the flags for this message.\n\t */\n\tpublic clearFlags(): this {\n\t\tthis.data.flags = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether to enforce recent uniqueness of the nonce of this message.\n\t *\n\t * @param enforceNonce - Whether to enforce recent uniqueness of the nonce of this message\n\t */\n\tpublic setEnforceNonce(enforceNonce = true): this {\n\t\tthis.data.enforce_nonce = enforceNonce;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the poll for this message.\n\t *\n\t * @param poll - The poll to set\n\t */\n\tpublic setPoll(poll: APIPoll | PollBuilder | ((builder: PollBuilder) => PollBuilder)): this {\n\t\tthis.data.poll = resolveBuilder(poll, PollBuilder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updates the poll for this message (and creates it if it doesn't exist)\n\t *\n\t * @param updater - The function to update the poll with\n\t */\n\tpublic updatePoll(updater: (builder: PollBuilder) => void): this {\n\t\tupdater((this.data.poll ??= new PollBuilder()));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clears the poll for this message.\n\t */\n\tpublic clearPoll(): this {\n\t\tthis.data.poll = undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Serializes this builder to API-compatible JSON data.\n\t *\n\t * Note that by disabling validation, there is no guarantee that the resulting object will be valid.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t */\n\tpublic toJSON(validationOverride?: boolean): RESTPostAPIChannelMessageJSONBody {\n\t\tconst { poll, allowed_mentions, attachments, embeds, components, message_reference, ...rest } = this.data;\n\n\t\tconst data = {\n\t\t\t...structuredClone(rest),\n\t\t\t// Wherever we pass false, it's covered by the messagePredicate already\n\t\t\tpoll: poll?.toJSON(false),\n\t\t\tallowed_mentions: allowed_mentions?.toJSON(false),\n\t\t\tattachments: attachments.map((attachment) => attachment.toJSON(false)),\n\t\t\tembeds: embeds.map((embed) => embed.toJSON(false)),\n\t\t\t// Here, the messagePredicate does specific constraints rather than using the componentPredicate\n\t\t\tcomponents: components.map((component) => component.toJSON(validationOverride)),\n\t\t\tmessage_reference: message_reference?.toJSON(false),\n\t\t};\n\n\t\tvalidate(messagePredicate, data, validationOverride);\n\n\t\treturn data as RESTPostAPIChannelMessageJSONBody;\n\t}\n\n\t/**\n\t * Serializes this builder to both JSON body and file data for multipart/form-data requests.\n\t *\n\t * @param validationOverride - Force validation to run/not run regardless of your global preference\n\t * @remarks\n\t * This method extracts file data from attachments that have files set via {@link AttachmentBuilder.setFileData}.\n\t * The returned body includes attachment metadata, while files contains the binary data for upload.\n\t */\n\tpublic toFileBody(validationOverride?: boolean): FileBodyEncodableResult<RESTPostAPIChannelMessageJSONBody> {\n\t\tconst body = this.toJSON(false);\n\n\t\tconst files: RawFile[] = [];\n\t\tfor (const attachment of this.data.attachments) {\n\t\t\tconst rawFile = attachment.getRawFile();\n\t\t\t// Only if data or content type are set, since that implies the intent is to send a new file.\n\t\t\t// In case it's contentType but not data, a validation error will be thrown right after.\n\t\t\tif (rawFile?.data || rawFile?.contentType) {\n\t\t\t\tfiles.push(rawFile as RawFile);\n\t\t\t}\n\t\t}\n\n\t\tconst combined = { body, files };\n\t\tvalidate(fileBodyMessagePredicate, combined, validationOverride);\n\n\t\treturn combined as FileBodyEncodableResult<RESTPostAPIChannelMessageJSONBody>;\n\t}\n}\n"],"mappings":"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","names":["import_v10","import_zod","import_zod","import_v10","import_v10","import_ts_mixer","import_v10","import_v10","import_v10","import_zod","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_zod","import_v10","import_v10","import_zod","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_v10","import_zod","import_v10","import_v10","import_v10","import_zod","import_v10","import_v10","import_ts_mixer","import_v10","import_ts_mixer","import_v10","import_v10","import_ts_mixer","import_v10","import_v10","import_ts_mixer","import_v10","import_v10","import_ts_mixer","import_v10","import_ts_mixer","import_v10","import_zod","namePredicate","import_ts_mixer","import_v10","import_v10","import_v10","import_zod","import_zod","namePredicate","import_v10","import_zod","import_v10","import_zod"]}
|