From c7ed54ac3f0cf1de2cadc7368e3455debedc9713 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=86MB=C3=98?= <69138346+TAEMBO@users.noreply.github.com> Date: Tue, 17 Sep 2024 01:18:08 -0700 Subject: [PATCH] types(MessageEditOptions): Omit `poll` (#10509) fix: creating poll from message edit Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com> --- packages/discord.js/src/structures/Webhook.js | 2 +- .../interfaces/InteractionResponses.js | 2 +- .../structures/interfaces/TextBasedChannel.js | 7 +- packages/discord.js/typings/index.d.ts | 227 +++++++++--------- packages/discord.js/typings/index.test-d.ts | 10 + 5 files changed, 134 insertions(+), 114 deletions(-) diff --git a/packages/discord.js/src/structures/Webhook.js b/packages/discord.js/src/structures/Webhook.js index 9b2bad0d5467..e52ec14040ae 100644 --- a/packages/discord.js/src/structures/Webhook.js +++ b/packages/discord.js/src/structures/Webhook.js @@ -126,7 +126,7 @@ class Webhook { /** * Options that can be passed into send. - * @typedef {BaseMessageOptions} WebhookMessageCreateOptions + * @typedef {BaseMessageOptionsWithPoll} WebhookMessageCreateOptions * @property {boolean} [tts=false] Whether the message should be spoken aloud * @property {MessageFlags} [flags] Which flags to set for the message. * Only the {@link MessageFlags.SuppressEmbeds} flag can be set. diff --git a/packages/discord.js/src/structures/interfaces/InteractionResponses.js b/packages/discord.js/src/structures/interfaces/InteractionResponses.js index 5be435199cb1..ea0e7adebd90 100644 --- a/packages/discord.js/src/structures/interfaces/InteractionResponses.js +++ b/packages/discord.js/src/structures/interfaces/InteractionResponses.js @@ -44,7 +44,7 @@ class InteractionResponses { /** * Options for a reply to a {@link BaseInteraction}. - * @typedef {BaseMessageOptions|SharedInteractionResponseOptions} InteractionReplyOptions + * @typedef {BaseMessageOptionsWithPoll} InteractionReplyOptions * @property {boolean} [tts=false] Whether the message should be spoken aloud * @property {boolean} [ephemeral] Whether the reply should be ephemeral * @property {boolean} [fetchReply] Whether to fetch the reply diff --git a/packages/discord.js/src/structures/interfaces/TextBasedChannel.js b/packages/discord.js/src/structures/interfaces/TextBasedChannel.js index c3f5a9e6c573..d2e408580253 100644 --- a/packages/discord.js/src/structures/interfaces/TextBasedChannel.js +++ b/packages/discord.js/src/structures/interfaces/TextBasedChannel.js @@ -80,6 +80,11 @@ class TextBasedChannel { * The files to send with the message. * @property {Array<(ActionRowBuilder|ActionRow|APIActionRowComponent)>} [components] * Action rows containing interactive components for the message (buttons, select menus) + */ + + /** + * The base message options for messages including a poll. + * @typedef {BaseMessageOptions} BaseMessageOptionsWithPoll * @property {PollData} [poll] The poll to send with the message */ @@ -93,7 +98,7 @@ class TextBasedChannel { /** * The options for sending a message. - * @typedef {BaseMessageOptions} BaseMessageCreateOptions + * @typedef {BaseMessageOptionsWithPoll} BaseMessageCreateOptions * @property {boolean} [tts=false] Whether the message should be spoken aloud * @property {string} [nonce] The nonce for the message * This property is required if `enforceNonce` set to `true`. diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index 4d186b21b4c5..0d5f928ea603 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -670,7 +670,7 @@ export class BaseGuildEmoji extends Emoji { } // tslint:disable-next-line no-empty-interface -export interface BaseGuildTextChannel extends TextBasedChannelFields {} +export interface BaseGuildTextChannel extends TextBasedChannelFields { } export class BaseGuildTextChannel extends GuildChannel { protected constructor(guild: Guild, data?: RawGuildChannelData, client?: Client, immediatePatch?: boolean); public defaultAutoArchiveDuration?: ThreadAutoArchiveDuration; @@ -691,7 +691,7 @@ export class BaseGuildTextChannel extends GuildChannel { } // tslint:disable-next-line no-empty-interface -export interface BaseGuildVoiceChannel extends Omit, 'lastPinTimestamp' | 'lastPinAt'> {} +export interface BaseGuildVoiceChannel extends Omit, 'lastPinTimestamp' | 'lastPinAt'> { } export class BaseGuildVoiceChannel extends GuildChannel { public constructor(guild: Guild, data?: RawGuildChannelData); public bitrate: number; @@ -865,11 +865,11 @@ export { StringSelectMenuComponent as SelectMenuComponent, }; -export class UserSelectMenuComponent extends BaseSelectMenuComponent {} +export class UserSelectMenuComponent extends BaseSelectMenuComponent { } -export class RoleSelectMenuComponent extends BaseSelectMenuComponent {} +export class RoleSelectMenuComponent extends BaseSelectMenuComponent { } -export class MentionableSelectMenuComponent extends BaseSelectMenuComponent {} +export class MentionableSelectMenuComponent extends BaseSelectMenuComponent { } export class ChannelSelectMenuComponent extends BaseSelectMenuComponent { public getChannelTypes(): ChannelType[] | null; @@ -896,9 +896,9 @@ export interface IconData { proxyIconURL?: string; } -export interface EmbedAuthorData extends Omit, IconData {} +export interface EmbedAuthorData extends Omit, IconData { } -export interface EmbedFooterData extends Omit, IconData {} +export interface EmbedFooterData extends Omit, IconData { } export interface EmbedAssetData extends Omit { proxyURL?: string; @@ -993,8 +993,8 @@ export abstract class BaseChannel extends Base { export type If = Value extends true ? TrueResult : Value extends false - ? FalseResult - : TrueResult | FalseResult; + ? FalseResult + : TrueResult | FalseResult; export class Client extends BaseClient { public constructor(options: ClientOptions); @@ -1273,8 +1273,8 @@ export class CommandInteractionOptionResolver['channel']>, { type: Type extends ChannelType.PublicThread | ChannelType.AnnouncementThread - ? ChannelType.PublicThread | ChannelType.AnnouncementThread - : Type; + ? ChannelType.PublicThread | ChannelType.AnnouncementThread + : Type; } >; /** @@ -1291,8 +1291,8 @@ export class CommandInteractionOptionResolver['channel']>, { type: Type extends ChannelType.PublicThread | ChannelType.AnnouncementThread - ? ChannelType.PublicThread | ChannelType.AnnouncementThread - : Type; + ? ChannelType.PublicThread | ChannelType.AnnouncementThread + : Type; } > | null; public getString(name: string, required: true): string; @@ -1345,7 +1345,7 @@ export interface DMChannel extends Omit< TextBasedChannelFields, 'bulkDelete' | 'fetchWebhooks' | 'createWebhook' | 'setRateLimitPerUser' | 'setNSFW' - > {} + > { } export class DMChannel extends BaseChannel { private constructor(client: Client, data?: RawDMChannelData); public flags: Readonly; @@ -1560,11 +1560,11 @@ export class GuildAuditLogs { private constructor(guild: Guild, data: RawGuildAuditLogEntryData, logs?: GuildAuditLogs); @@ -1662,7 +1662,7 @@ export class GuildMemberFlagsBitField extends BitField { public static resolve(bit?: BitFieldResolvable): number; } -export interface GuildMember extends PartialTextBasedChannelFields {} +export interface GuildMember extends PartialTextBasedChannelFields { } export class GuildMember extends Base { private constructor(client: Client, data: RawGuildMemberData, guild: Guild); private _roles: Snowflake[]; @@ -1912,10 +1912,10 @@ export type CacheTypeReducer< > = [State] extends ['cached'] ? CachedType : [State] extends ['raw'] - ? RawType - : [State] extends ['raw' | 'cached'] - ? PresentType - : Fallback; + ? RawType + : [State] extends ['raw' | 'cached'] + ? PresentType + : Fallback; export type Interaction = | ChatInputCommandInteraction @@ -2052,7 +2052,7 @@ export class InteractionCollector exte } // tslint:disable-next-line no-empty-interface -export interface InteractionWebhook extends PartialWebhookFields {} +export interface InteractionWebhook extends PartialWebhookFields { } export class InteractionWebhook { public constructor(client: Client, id: Snowflake, token: string); public readonly client: Client; @@ -2148,9 +2148,9 @@ export interface AwaitMessageCollectorOptionsParams< ComponentType extends MessageComponentType, Cached extends boolean = boolean, > extends Pick< - InteractionCollectorOptions[ComponentType]>, - keyof AwaitMessageComponentOptions - > { + InteractionCollectorOptions[ComponentType]>, + keyof AwaitMessageComponentOptions +> { componentType?: ComponentType; } @@ -2637,7 +2637,7 @@ export interface ThreadOnlyChannel | 'awaitMessages' | 'createMessageComponentCollector' | 'awaitMessageComponent' - > {} + > { } export abstract class ThreadOnlyChannel extends GuildChannel { public type: ChannelType.GuildForum | ChannelType.GuildMedia; public threads: GuildForumThreadManager; @@ -3338,7 +3338,7 @@ export interface PrivateThreadChannel extends ThreadChannel { // tslint:disable-next-line no-empty-interface export interface ThreadChannel - extends Omit, 'fetchWebhooks' | 'createWebhook' | 'setNSFW'> {} + extends Omit, 'fetchWebhooks' | 'createWebhook' | 'setNSFW'> { } export class ThreadChannel extends BaseChannel { private constructor(guild: Guild, data?: RawThreadChannelData, client?: Client); public archived: boolean | null; @@ -3437,7 +3437,7 @@ export interface AvatarDecorationData { } // tslint:disable-next-line no-empty-interface -export interface User extends PartialTextBasedChannelFields {} +export interface User extends PartialTextBasedChannelFields { } export class User extends Base { protected constructor(client: Client, data: RawUserData); private _equals(user: APIUser): boolean; @@ -3701,7 +3701,7 @@ export class VoiceState extends Base { } // tslint:disable-next-line no-empty-interface -export interface Webhook extends WebhookFields {} +export interface Webhook extends WebhookFields { } export class Webhook { private constructor(client: Client, data?: RawWebhookData); public avatar: string | null; @@ -3716,8 +3716,8 @@ export class Webhook { public token: Type extends WebhookType.Incoming ? string : Type extends WebhookType.ChannelFollower - ? null - : string | null; + ? null + : string | null; public type: Type; public applicationId: Type extends WebhookType.Application ? Snowflake : null; public get channel(): TextChannel | VoiceChannel | NewsChannel | StageChannel | ForumChannel | MediaChannel | null; @@ -3737,7 +3737,7 @@ export class Webhook { } // tslint:disable-next-line no-empty-interface -export interface WebhookClient extends WebhookFields, BaseClient {} +export interface WebhookClient extends WebhookFields, BaseClient { } export class WebhookClient extends BaseClient { public constructor(data: WebhookClientData, options?: WebhookClientOptions); public readonly client: this; @@ -4224,23 +4224,23 @@ export class ApplicationCommandPermissionsManager< public remove( options: | (FetchSingleOptions & { - token: string; - channels?: readonly (GuildChannelResolvable | ChannelPermissionConstant)[]; - roles?: readonly (RoleResolvable | RolePermissionConstant)[]; - users: readonly UserResolvable[]; - }) + token: string; + channels?: readonly (GuildChannelResolvable | ChannelPermissionConstant)[]; + roles?: readonly (RoleResolvable | RolePermissionConstant)[]; + users: readonly UserResolvable[]; + }) | (FetchSingleOptions & { - token: string; - channels?: readonly (GuildChannelResolvable | ChannelPermissionConstant)[]; - roles: readonly (RoleResolvable | RolePermissionConstant)[]; - users?: readonly UserResolvable[]; - }) + token: string; + channels?: readonly (GuildChannelResolvable | ChannelPermissionConstant)[]; + roles: readonly (RoleResolvable | RolePermissionConstant)[]; + users?: readonly UserResolvable[]; + }) | (FetchSingleOptions & { - token: string; - channels: readonly (GuildChannelResolvable | ChannelPermissionConstant)[]; - roles?: readonly (RoleResolvable | RolePermissionConstant)[]; - users?: readonly UserResolvable[]; - }), + token: string; + channels: readonly (GuildChannelResolvable | ChannelPermissionConstant)[]; + roles?: readonly (RoleResolvable | RolePermissionConstant)[]; + users?: readonly UserResolvable[]; + }), ): Promise; public set( options: FetchSingleOptions & EditApplicationCommandPermissionsMixin, @@ -4318,7 +4318,7 @@ export class EntitlementManager extends CachedManager; } -export interface FetchGuildApplicationCommandFetchOptions extends Omit {} +export interface FetchGuildApplicationCommandFetchOptions extends Omit { } export class GuildApplicationCommandManager extends ApplicationCommandManager { private constructor(guild: Guild, iterable?: Iterable); @@ -4781,7 +4781,7 @@ export interface WebhookFields extends PartialWebhookFields { //#region Typedefs -export interface ActivitiesOptions extends Omit {} +export interface ActivitiesOptions extends Omit { } export interface ActivityOptions { name: string; @@ -5141,10 +5141,10 @@ export interface AutoModerationTriggerMetadata { } export interface AwaitMessageComponentOptions - extends Omit, 'max' | 'maxComponents' | 'maxUsers'> {} + extends Omit, 'max' | 'maxComponents' | 'maxUsers'> { } export interface ModalSubmitInteractionCollectorOptions - extends Omit, 'channel' | 'message' | 'guild' | 'interactionType'> {} + extends Omit, 'channel' | 'message' | 'guild' | 'interactionType'> { } export interface AwaitModalSubmitOptions extends Omit, 'max' | 'maxComponents' | 'maxUsers'> { @@ -5166,7 +5166,7 @@ export interface BanOptions { reason?: string; } -export interface BulkBanOptions extends Omit {} +export interface BulkBanOptions extends Omit { } export interface BulkBanResult { bannedUsers: readonly Snowflake[]; @@ -5254,8 +5254,8 @@ export type CacheFactory = ( export type CacheWithLimitsOptions = { [K in keyof Caches]?: Caches[K][0]['prototype'] extends DataManager - ? LimitedCollectionOptions | number - : never; + ? LimitedCollectionOptions | number + : never; }; export interface CategoryCreateChannelOptions { @@ -5520,9 +5520,9 @@ export interface CommandInteractionResolvedData { focused: true; type: - | ApplicationCommandOptionType.String - | ApplicationCommandOptionType.Integer - | ApplicationCommandOptionType.Number; + | ApplicationCommandOptionType.String + | ApplicationCommandOptionType.Integer + | ApplicationCommandOptionType.Number; value: string; } @@ -5942,20 +5942,20 @@ export interface GuildAuditLogsEntryExtraField { [AuditLogEvent.MessageUnpin]: { channel: GuildTextBasedChannel | { id: Snowflake }; messageId: Snowflake }; [AuditLogEvent.MemberDisconnect]: { count: number }; [AuditLogEvent.ChannelOverwriteCreate]: - | Role - | GuildMember - | { id: Snowflake; name: string; type: AuditLogOptionsType.Role } - | { id: Snowflake; type: AuditLogOptionsType.Member }; + | Role + | GuildMember + | { id: Snowflake; name: string; type: AuditLogOptionsType.Role } + | { id: Snowflake; type: AuditLogOptionsType.Member }; [AuditLogEvent.ChannelOverwriteUpdate]: - | Role - | GuildMember - | { id: Snowflake; name: string; type: AuditLogOptionsType.Role } - | { id: Snowflake; type: AuditLogOptionsType.Member }; + | Role + | GuildMember + | { id: Snowflake; name: string; type: AuditLogOptionsType.Role } + | { id: Snowflake; type: AuditLogOptionsType.Member }; [AuditLogEvent.ChannelOverwriteDelete]: - | Role - | GuildMember - | { id: Snowflake; name: string; type: AuditLogOptionsType.Role } - | { id: Snowflake; type: AuditLogOptionsType.Member }; + | Role + | GuildMember + | { id: Snowflake; name: string; type: AuditLogOptionsType.Role } + | { id: Snowflake; type: AuditLogOptionsType.Member }; [AuditLogEvent.StageInstanceCreate]: StageChannel | { id: Snowflake }; [AuditLogEvent.StageInstanceDelete]: StageChannel | { id: Snowflake }; [AuditLogEvent.StageInstanceUpdate]: StageChannel | { id: Snowflake }; @@ -5984,8 +5984,8 @@ export interface GuildAuditLogsEntryTargetField> {} +export interface AutoModerationRuleEditOptions extends Partial> { } -export interface AutoModerationTriggerMetadataOptions extends Partial {} +export interface AutoModerationTriggerMetadataOptions extends Partial { } export interface AutoModerationActionOptions { type: AutoModerationActionType; @@ -6241,10 +6241,10 @@ export type GuildScheduledEventResolvable = Snowflake | GuildScheduledEvent; export type GuildScheduledEventSetStatusArg = Status extends GuildScheduledEventStatus.Scheduled - ? GuildScheduledEventStatus.Active | GuildScheduledEventStatus.Canceled - : Status extends GuildScheduledEventStatus.Active - ? GuildScheduledEventStatus.Completed - : never; + ? GuildScheduledEventStatus.Active | GuildScheduledEventStatus.Canceled + : Status extends GuildScheduledEventStatus.Active + ? GuildScheduledEventStatus.Completed + : never; export interface GuildScheduledEventUser { guildScheduledEventId: Snowflake; @@ -6331,9 +6331,9 @@ export interface InteractionDeferReplyOptions extends SharedInteractionResponseO fetchReply?: boolean; } -export interface InteractionDeferUpdateOptions extends Omit {} +export interface InteractionDeferUpdateOptions extends Omit { } -export interface InteractionReplyOptions extends BaseMessageOptions, SharedInteractionResponseOptions { +export interface InteractionReplyOptions extends BaseMessageOptionsWithPoll { tts?: boolean; ephemeral?: boolean; fetchReply?: boolean; @@ -6445,10 +6445,10 @@ export type CollectedMessageInteraction = >; export interface MessageComponentCollectorOptions - extends Omit, 'channel' | 'message' | 'guild' | 'interactionType'> {} + extends Omit, 'channel' | 'message' | 'guild' | 'interactionType'> { } export interface MessageChannelComponentCollectorOptions - extends Omit, 'channel' | 'guild' | 'interactionType'> {} + extends Omit, 'channel' | 'guild' | 'interactionType'> { } export interface MessageInteractionMetadata { id: Snowflake; @@ -6501,10 +6501,13 @@ export interface BaseMessageOptions { | ActionRowData | APIActionRowComponent )[]; +} + +export interface BaseMessageOptionsWithPoll extends BaseMessageOptions { poll?: PollData; } -export interface MessageCreateOptions extends BaseMessageOptions { +export interface MessageCreateOptions extends BaseMessageOptionsWithPoll { tts?: boolean; nonce?: string | number; enforceNonce?: boolean; @@ -6517,8 +6520,8 @@ export interface MessageCreateOptions extends BaseMessageOptions { } export interface GuildForumThreadMessageCreateOptions - extends Omit, - Pick {} + extends BaseMessageOptions, + Pick { } export interface MessageEditAttachmentData { id: Snowflake; @@ -6649,7 +6652,7 @@ export type PermissionResolvable = BitFieldResolvable extends ReadonlyArray> {} +export interface RecursiveReadonlyArray extends ReadonlyArray> { } export interface PartialRecipient { username: string; @@ -6695,30 +6698,30 @@ export type Partialize< NullableKeys extends keyof PartialType | null = null, OverridableKeys extends keyof PartialType | '' = '', > = { - [K in keyof Omit]: K extends 'partial' + [K in keyof Omit]: K extends 'partial' ? true : K extends NulledKeys - ? null - : K extends NullableKeys - ? PartialType[K] | null - : PartialType[K]; -}; + ? null + : K extends NullableKeys + ? PartialType[K] | null + : PartialType[K]; + }; export interface PartialDMChannel extends Partialize { lastMessageId: undefined; } -export interface PartialGuildMember extends Partialize {} +export interface PartialGuildMember extends Partialize { } export interface PartialMessage - extends Partialize {} + extends Partialize { } -export interface PartialMessageReaction extends Partialize {} +export interface PartialMessageReaction extends Partialize { } export interface PartialGuildScheduledEvent - extends Partialize {} + extends Partialize { } -export interface PartialThreadMember extends Partialize {} +export interface PartialThreadMember extends Partialize { } export interface PartialOverwriteData { id: Snowflake | number; @@ -6741,7 +6744,7 @@ export enum Partials { ThreadMember, } -export interface PartialUser extends Partialize {} +export interface PartialUser extends Partialize { } export type PresenceStatusData = ClientPresenceStatus | 'invisible'; @@ -6904,8 +6907,8 @@ export interface SweeperDefinitions { export type SweeperOptions = { [Key in keyof SweeperDefinitions]?: SweeperDefinitions[Key][2] extends true - ? SweepOptions | LifetimeSweepOptions - : SweepOptions; + ? SweepOptions | LifetimeSweepOptions + : SweepOptions; }; export interface LimitedCollectionOptions { @@ -7011,7 +7014,7 @@ export interface WebhookClientDataURL { url: string; } -export interface WebhookClientOptions extends Pick {} +export interface WebhookClientOptions extends Pick { } export interface WebhookDeleteOptions { token?: string; @@ -7029,7 +7032,9 @@ export interface WebhookMessageEditOptions extends Omit { message?: MessageResolvable | '@original'; } @@ -7094,14 +7099,14 @@ export interface ClientApplicationInstallParams { export type Serialized = Value extends symbol | bigint | (() => any) ? never : Value extends number | string | boolean | undefined - ? Value - : Value extends JSONEncodable - ? JSONResult - : Value extends ReadonlyArray - ? Serialized[] - : Value extends ReadonlyMap | ReadonlySet - ? {} - : { [K in keyof Value]: Serialized }; + ? Value + : Value extends JSONEncodable + ? JSONResult + : Value extends ReadonlyArray + ? Serialized[] + : Value extends ReadonlyMap | ReadonlySet + ? {} + : { [K in keyof Value]: Serialized }; //#endregion diff --git a/packages/discord.js/typings/index.test-d.ts b/packages/discord.js/typings/index.test-d.ts index 1f499be832d6..f23023f1acca 100644 --- a/packages/discord.js/typings/index.test-d.ts +++ b/packages/discord.js/typings/index.test-d.ts @@ -210,6 +210,7 @@ import { ApplicationEmojiManager, StickerPack, SendableChannels, + PollData, } from '.'; import { expectAssignable, expectDeprecated, expectNotAssignable, expectNotType, expectType } from 'tsd'; import type { ContextMenuCommandBuilder, SlashCommandBuilder } from '@discordjs/builders'; @@ -2576,6 +2577,8 @@ await textChannel.send({ }); declare const poll: Poll; +declare const message: Message; +declare const pollData: PollData; { expectType(await poll.end()); @@ -2589,6 +2592,13 @@ declare const poll: Poll; messageId: snowflake, answerId: 1, }); + + await message.edit({ + // @ts-expect-error + poll: pollData, + }); + + await chatInputInteraction.editReply({ poll: pollData }); } expectType>(await client.fetchStickerPacks());