import type { AllowedMentions, BigString, DiscordActivity, DiscordActivityAssets, DiscordActivityEmoji, DiscordActivityInstance, DiscordActivityLocation, DiscordAllowedMentions, DiscordApplication, DiscordApplicationCommand, DiscordApplicationCommandOption, DiscordApplicationCommandOptionChoice, DiscordApplicationCommandPermissions, DiscordAttachment, DiscordAuditLogEntry, DiscordAutoModerationAction, DiscordAutoModerationActionExecution, DiscordAutoModerationActionMetadata, DiscordAutoModerationRule, DiscordAutoModerationRuleTriggerMetadata, DiscordAvatarDecorationData, DiscordChannel, DiscordCollectibles, DiscordDefaultReactionEmoji, DiscordEmbed, DiscordEmbedAuthor, DiscordEmbedFooter, DiscordEmbedImage, DiscordEmbedVideo, DiscordEmoji, DiscordEntitlement, DiscordForumTag, DiscordGetGatewayBot, DiscordGuild, DiscordGuildApplicationCommandPermissions, DiscordGuildOnboarding, DiscordGuildOnboardingPrompt, DiscordGuildOnboardingPromptOption, DiscordGuildWidget, DiscordGuildWidgetSettings, DiscordIncidentsData, DiscordIntegrationAccount, DiscordIntegrationApplication, DiscordIntegrationCreateUpdate, DiscordInteraction, DiscordInteractionCallback, DiscordInteractionCallbackResponse, DiscordInteractionDataOption, DiscordInteractionDataResolved, DiscordInteractionResource, DiscordInviteMetadata, DiscordInviteStageInstance, DiscordLobby, DiscordLobbyInvite, DiscordLobbyMember, DiscordLobbyMessage, DiscordMediaGalleryItem, DiscordMember, DiscordMessage, DiscordMessageCall, DiscordMessageComponent, DiscordMessageComponentFromModalInteractionResponse, DiscordMessageInteractionMetadata, DiscordMessagePin, DiscordMessageSnapshot, DiscordNameplate, DiscordOptionalAuditEntryInfo, DiscordPoll, DiscordPollMedia, DiscordPresenceUpdate, DiscordRole, DiscordRoleColors, DiscordScheduledEvent, DiscordScheduledEventRecurrenceRule, DiscordSessionStartLimit, DiscordSharedClientTheme, DiscordSku, DiscordSoundboardSound, DiscordStageInstance, DiscordSticker, DiscordStickerPack, DiscordSubscription, DiscordTeam, DiscordTeamMember, DiscordTemplate, DiscordThreadMember, DiscordThreadMemberGuildCreate, DiscordUnfurledMediaItem, DiscordUser, DiscordUserPrimaryGuild, DiscordVoiceRegion, DiscordVoiceState, DiscordWebhook, DiscordWelcomeScreen, RecursivePartial, } from '@discordeno/types'; import { bigintToSnowflake, snowflakeToBigint } from '@discordeno/utils'; import type { Bot } from './bot.js'; import { createDesiredPropertiesObject, type DesiredPropertiesBehavior, type SetupDesiredProps, type TransformersDesiredProperties, } from './desiredProperties.js'; import { transformActivity, transformActivityAssets, transformActivityEmoji, transformActivityInstance, transformActivityLocation, } from './transformers/activity.js'; import { transformApplication } from './transformers/application.js'; import { transformApplicationCommand } from './transformers/applicationCommand.js'; import { transformApplicationCommandOption } from './transformers/applicationCommandOption.js'; import { transformApplicationCommandOptionChoice } from './transformers/applicationCommandOptionChoice.js'; import { transformApplicationCommandPermissions, transformGuildApplicationCommandPermissions } from './transformers/applicationCommandPermission.js'; import { transformAttachment } from './transformers/attachment.js'; import { transformAuditLogEntry, transformOptionalAuditEntryInfo } from './transformers/auditLogEntry.js'; import { transformAutoModerationAction, transformAutoModerationActionExecution, transformAutoModerationActionMetadata, } from './transformers/automodActionExecution.js'; import { transformAutoModerationRule, transformautoModerationRuleTriggerMetadata } from './transformers/automodRule.js'; import { transformAvatarDecorationData } from './transformers/avatarDecorationData.js'; import { transformChannel, transformForumTag } from './transformers/channel.js'; import { transformComponent, transformMediaGalleryItem, transformUnfurledMediaItem } from './transformers/component.js'; import { transformEmbed, transformEmbedAuthor, transformEmbedFooter, transformEmbedImage, transformEmbedVideo } from './transformers/embed.js'; import { transformDefaultReactionEmoji, transformEmoji } from './transformers/emoji.js'; import { transformEntitlement } from './transformers/entitlement.js'; import { transformGatewayBot, transformSessionStartLimit } from './transformers/gatewayBot.js'; import { transformGuild } from './transformers/guild.js'; import { transformIncidentsData } from './transformers/incidentsData.js'; import { transformIntegration, transformIntegrationAccount, transformIntegrationApplication } from './transformers/integration.js'; import { transformInteraction, transformInteractionCallback, transformInteractionCallbackResponse, transformInteractionDataOption, transformInteractionDataResolved, transformInteractionResource, } from './transformers/interaction.js'; import { transformInvite } from './transformers/invite.js'; import { transformLobby, transformLobbyInvite, transformLobbyMember, transformLobbyMessage } from './transformers/lobby.js'; import { transformMember } from './transformers/member.js'; import { transformMessage, transformMessageCall, transformMessageInteractionMetadata, transformMessagePin, transformMessageSnapshot, transformSharedClientTheme, } from './transformers/message.js'; import { transformGuildOnboarding, transformGuildOnboardingPrompt, transformGuildOnboardingPromptOption } from './transformers/onboarding.js'; import { transformPoll, transformPollMedia } from './transformers/poll.js'; import { transformPresence } from './transformers/presence.js'; import { transformActivityAssetsToDiscordActivityAssets, transformActivityToDiscordActivity } from './transformers/reverse/activity.js'; import { transformAllowedMentionsToDiscordAllowedMentions } from './transformers/reverse/allowedMentions.js'; import { transformApplicationToDiscordApplication } from './transformers/reverse/application.js'; import { transformApplicationCommandToDiscordApplicationCommand } from './transformers/reverse/applicationCommand.js'; import { transformApplicationCommandOptionToDiscordApplicationCommandOption } from './transformers/reverse/applicationCommandOption.js'; import { transformApplicationCommandOptionChoiceToDiscordApplicationCommandOptionChoice } from './transformers/reverse/applicationCommandOptionChoice.js'; import { transformAttachmentToDiscordAttachment } from './transformers/reverse/attachment.js'; import { transformComponentToDiscordComponent, transformMediaGalleryItemToDiscordMediaGalleryItem, transformUnfurledMediaItemToDiscordUnfurledMediaItem, } from './transformers/reverse/component.js'; import { transformEmbedToDiscordEmbed } from './transformers/reverse/embed.js'; import { transformMemberToDiscordMember, transformUserToDiscordUser } from './transformers/reverse/member.js'; import { transformTeamToDiscordTeam } from './transformers/reverse/team.js'; import { transformCollectiblesToDiscordCollectibles, transformNameplateToDiscordNameplate } from './transformers/reverse/user.js'; import { transformRole, transformRoleColors } from './transformers/role.js'; import { transformScheduledEvent, transformScheduledEventRecurrenceRule } from './transformers/scheduledEvent.js'; import { transformSku } from './transformers/sku.js'; import { transformSoundboardSound } from './transformers/soundboardSound.js'; import { transformStageInstance } from './transformers/stageInstance.js'; import { transformInviteStageInstance } from './transformers/stageInviteInstance.js'; import { transformSticker, transformStickerPack } from './transformers/sticker.js'; import { transformSubscription } from './transformers/subscription.js'; import { transformTeam, transformTeamMember } from './transformers/team.js'; import { transformTemplate } from './transformers/template.js'; import { type ThreadMemberTransformerExtra, transformThreadMember, transformThreadMemberGuildCreate } from './transformers/threadMember.js'; import type { Activity, ActivityAssets, ActivityEmoji, ActivityInstance, ActivityLocation, Application, ApplicationCommand, ApplicationCommandOption, ApplicationCommandOptionChoice, ApplicationCommandPermissions, Attachment, AuditLogEntry, AutoModerationAction, AutoModerationActionExecution, AutoModerationActionMetadata, AutoModerationRule, AutoModerationRuleTriggerMetadata, AvatarDecorationData, Channel, Collectibles, Component, DefaultReactionEmoji, Embed, EmbedAuthor, EmbedFooter, EmbedImage, EmbedVideo, Emoji, Entitlement, ForumTag, GetGatewayBot, Guild, GuildApplicationCommandPermissions, GuildOnboarding, GuildOnboardingPrompt, GuildOnboardingPromptOption, GuildWidget, GuildWidgetSettings, IncidentsData, Integration, IntegrationAccount, IntegrationApplication, Interaction, InteractionCallback, InteractionCallbackResponse, InteractionDataOption, InteractionDataResolved, InteractionResource, Invite, InviteStageInstance, Lobby, LobbyInvite, LobbyMember, LobbyMessage, MediaGalleryItem, Member, Message, MessageCall, MessageInteractionMetadata, MessagePin, MessageSnapshot, Nameplate, OptionalAuditEntryInfo, Poll, PollMedia, PresenceUpdate, Role, RoleColors, ScheduledEvent, ScheduledEventRecurrenceRule, SessionStartLimit, SharedClientTheme, Sku, SoundboardSound, StageInstance, Sticker, StickerPack, Subscription, Team, TeamMember, Template, ThreadMember, ThreadMemberGuildCreate, UnfurledMediaItem, User, UserPrimaryGuild, VoiceRegion, VoiceState, Webhook, WelcomeScreen, } from './transformers/types.js'; import { transformCollectibles, transformNameplate, transformUser, transformUserPrimaryGuild } from './transformers/user.js'; import { transformVoiceRegion } from './transformers/voiceRegion.js'; import { transformVoiceState } from './transformers/voiceState.js'; import { transformWebhook } from './transformers/webhook.js'; import { transformWelcomeScreen } from './transformers/welcomeScreen.js'; import { transformWidget } from './transformers/widget.js'; import { transformWidgetSettings } from './transformers/widgetSettings.js'; export type TransformerInformations = { activity: TransformerInformation; activityAssets: TransformerInformation; activityEmoji: TransformerInformation; activityInstance: TransformerInformation; activityLocation: TransformerInformation; application: TransformerInformation; applicationCommand: TransformerInformation; applicationCommandOption: TransformerInformation; applicationCommandOptionChoice: TransformerInformation; applicationCommandPermissions: TransformerInformation; attachment: TransformerInformation; auditLogEntry: TransformerInformation; autoModerationAction: TransformerInformation; autoModerationActionExecution: TransformerInformation; autoModerationActionMetadata: TransformerInformation; autoModerationRule: TransformerInformation; autoModerationRuleTriggerMetadata: TransformerInformation; avatarDecorationData: TransformerInformation; channel: TransformerInformation; collectibles: TransformerInformation; component: TransformerInformation; defaultReactionEmoji: TransformerInformation; embed: TransformerInformation; embedAuthor: TransformerInformation; embedFooter: TransformerInformation; embedImage: TransformerInformation; embedVideo: TransformerInformation; emoji: TransformerInformation; entitlement: TransformerInformation; forumTag: TransformerInformation; gatewayBot: TransformerInformation; guild: TransformerInformation; guildApplicationCommandPermissions: TransformerInformation; guildOnboarding: TransformerInformation; guildOnboardingPrompt: TransformerInformation; guildOnboardingPromptOption: TransformerInformation; incidentsData: TransformerInformation; integration: TransformerInformation; integrationAccount: TransformerInformation; integrationApplication: TransformerInformation; interaction: TransformerInformation; interactionCallback: TransformerInformation; interactionCallbackResponse: TransformerInformation; interactionDataOption: TransformerInformation; interactionDataResolved: TransformerInformation< DiscordInteractionDataResolved, InteractionDataResolved, true, { shardId?: number; guildId?: BigString } >; interactionResource: TransformerInformation; invite: TransformerInformation; inviteStageInstance: TransformerInformation; lobby: TransformerInformation; lobbyMember: TransformerInformation; lobbyMessage: TransformerInformation; lobbyInvite: TransformerInformation; mediaGalleryItem: TransformerInformation; member: TransformerInformation; message: TransformerInformation; messageCall: TransformerInformation; messageInteractionMetadata: TransformerInformation; messagePin: TransformerInformation; messageSnapshot: TransformerInformation; nameplate: TransformerInformation; optionalAuditEntryInfo: TransformerInformation; poll: TransformerInformation; pollMedia: TransformerInformation; presence: TransformerInformation; role: TransformerInformation; roleColors: TransformerInformation; scheduledEvent: TransformerInformation; scheduledEventRecurrenceRule: TransformerInformation; sessionStartLimit: TransformerInformation; sharedClientTheme: TransformerInformation; sku: TransformerInformation; soundboardSound: TransformerInformation; stageInstance: TransformerInformation; sticker: TransformerInformation; stickerPack: TransformerInformation; subscription: TransformerInformation; team: TransformerInformation; teamMember: TransformerInformation; template: TransformerInformation; threadMember: TransformerInformation; threadMemberGuildCreate: TransformerInformation; unfurledMediaItem: TransformerInformation; user: TransformerInformation; userPrimaryGuild: TransformerInformation; voiceRegion: TransformerInformation; voiceState: TransformerInformation; webhook: TransformerInformation; welcomeScreen: TransformerInformation; widget: TransformerInformation; widgetSettings: TransformerInformation; }; export type Transformers = TransformerFunctions< TProps, TBehavior > & { customizers: TransformerCustomizers; desiredProperties: TProps; reverse: { activity: (bot: Bot, payload: Activity) => DiscordActivity; activityAssets: (bot: Bot, payload: ActivityAssets) => DiscordActivityAssets; allowedMentions: (bot: Bot, payload: AllowedMentions) => DiscordAllowedMentions; application: (bot: Bot, payload: Application) => DiscordApplication; applicationCommand: (bot: Bot, payload: ApplicationCommand) => DiscordApplicationCommand; applicationCommandOption: (bot: Bot, payload: ApplicationCommandOption) => DiscordApplicationCommandOption; applicationCommandOptionChoice: (bot: Bot, payload: ApplicationCommandOptionChoice) => DiscordApplicationCommandOptionChoice; attachment: (bot: Bot, payload: SetupDesiredProps) => DiscordAttachment; collectibles: (bot: Bot, payload: SetupDesiredProps) => DiscordCollectibles; component: (bot: Bot, payload: Component) => DiscordMessageComponent | DiscordMessageComponentFromModalInteractionResponse; embed: (bot: Bot, payload: Embed) => DiscordEmbed; mediaGalleryItem: (bot: Bot, payload: MediaGalleryItem) => DiscordMediaGalleryItem; member: (bot: Bot, payload: SetupDesiredProps) => DiscordMember; nameplate: (bot: Bot, payload: SetupDesiredProps) => DiscordNameplate; snowflake: (snowflake: BigString) => string; team: (bot: Bot, payload: Team) => DiscordTeam; unfurledMediaItem: (bot: Bot, payload: UnfurledMediaItem) => DiscordUnfurledMediaItem; user: (bot: Bot, payload: SetupDesiredProps) => DiscordUser; }; snowflake: (snowflake: BigString) => bigint; }; const defaultCustomizer = (_bot: unknown, _payload: unknown, structure: unknown) => structure; export function createTransformers( options: RecursivePartial>, ): Transformers { const _options = options as RecursivePartial>; return { customizers: { activity: _options.customizers?.activity ?? defaultCustomizer, activityAssets: _options.customizers?.activityAssets ?? defaultCustomizer, activityEmoji: _options.customizers?.activityEmoji ?? defaultCustomizer, activityInstance: _options.customizers?.activityInstance ?? defaultCustomizer, activityLocation: _options.customizers?.activityLocation ?? defaultCustomizer, application: _options.customizers?.application ?? defaultCustomizer, applicationCommand: _options.customizers?.applicationCommand ?? defaultCustomizer, applicationCommandOption: _options.customizers?.applicationCommandOption ?? defaultCustomizer, applicationCommandOptionChoice: _options.customizers?.applicationCommandOptionChoice ?? defaultCustomizer, applicationCommandPermissions: _options.customizers?.applicationCommandPermissions ?? defaultCustomizer, attachment: _options.customizers?.attachment ?? defaultCustomizer, auditLogEntry: _options.customizers?.auditLogEntry ?? defaultCustomizer, autoModerationAction: _options.customizers?.autoModerationAction ?? defaultCustomizer, autoModerationActionExecution: _options.customizers?.autoModerationActionExecution ?? defaultCustomizer, autoModerationActionMetadata: _options.customizers?.autoModerationActionMetadata ?? defaultCustomizer, autoModerationRule: _options.customizers?.autoModerationRule ?? defaultCustomizer, autoModerationRuleTriggerMetadata: _options.customizers?.autoModerationRuleTriggerMetadata ?? defaultCustomizer, avatarDecorationData: _options.customizers?.avatarDecorationData ?? defaultCustomizer, channel: _options.customizers?.channel ?? defaultCustomizer, collectibles: _options.customizers?.collectibles ?? defaultCustomizer, component: _options.customizers?.component ?? defaultCustomizer, defaultReactionEmoji: _options.customizers?.defaultReactionEmoji ?? defaultCustomizer, embed: _options.customizers?.embed ?? defaultCustomizer, embedAuthor: _options.customizers?.embedAuthor ?? defaultCustomizer, embedFooter: _options.customizers?.embedFooter ?? defaultCustomizer, embedImage: _options.customizers?.embedImage ?? defaultCustomizer, embedVideo: _options.customizers?.embedVideo ?? defaultCustomizer, emoji: _options.customizers?.emoji ?? defaultCustomizer, entitlement: _options.customizers?.entitlement ?? defaultCustomizer, forumTag: _options.customizers?.forumTag ?? defaultCustomizer, gatewayBot: _options.customizers?.gatewayBot ?? defaultCustomizer, guild: _options.customizers?.guild ?? defaultCustomizer, guildApplicationCommandPermissions: _options.customizers?.guildApplicationCommandPermissions ?? defaultCustomizer, guildOnboarding: _options.customizers?.guildOnboarding ?? defaultCustomizer, guildOnboardingPrompt: _options.customizers?.guildOnboardingPrompt ?? defaultCustomizer, guildOnboardingPromptOption: _options.customizers?.guildOnboardingPromptOption ?? defaultCustomizer, incidentsData: _options.customizers?.incidentsData ?? defaultCustomizer, integration: _options.customizers?.integration ?? defaultCustomizer, integrationAccount: _options.customizers?.integrationAccount ?? defaultCustomizer, integrationApplication: _options.customizers?.integrationApplication ?? defaultCustomizer, interaction: _options.customizers?.interaction ?? defaultCustomizer, interactionCallback: _options.customizers?.interactionCallback ?? defaultCustomizer, interactionCallbackResponse: _options.customizers?.interactionCallbackResponse ?? defaultCustomizer, interactionDataOption: _options.customizers?.interactionDataOption ?? defaultCustomizer, interactionDataResolved: _options.customizers?.interactionDataResolved ?? defaultCustomizer, interactionResource: _options.customizers?.interactionResource ?? defaultCustomizer, invite: _options.customizers?.invite ?? defaultCustomizer, inviteStageInstance: _options.customizers?.inviteStageInstance ?? defaultCustomizer, lobby: _options.customizers?.lobby ?? defaultCustomizer, lobbyMember: _options.customizers?.lobbyMember ?? defaultCustomizer, lobbyMessage: _options.customizers?.lobbyMessage ?? defaultCustomizer, lobbyInvite: _options.customizers?.lobbyInvite ?? defaultCustomizer, mediaGalleryItem: _options.customizers?.mediaGalleryItem ?? defaultCustomizer, member: _options.customizers?.member ?? defaultCustomizer, message: _options.customizers?.message ?? defaultCustomizer, messageCall: _options.customizers?.messageCall ?? defaultCustomizer, messageInteractionMetadata: _options.customizers?.messageInteractionMetadata ?? defaultCustomizer, messagePin: _options.customizers?.messagePin ?? defaultCustomizer, messageSnapshot: _options.customizers?.messageSnapshot ?? defaultCustomizer, nameplate: _options.customizers?.nameplate ?? defaultCustomizer, optionalAuditEntryInfo: _options.customizers?.optionalAuditEntryInfo ?? defaultCustomizer, poll: _options.customizers?.poll ?? defaultCustomizer, pollMedia: _options.customizers?.pollMedia ?? defaultCustomizer, presence: _options.customizers?.presence ?? defaultCustomizer, role: _options.customizers?.role ?? defaultCustomizer, roleColors: _options.customizers?.roleColors ?? defaultCustomizer, scheduledEvent: _options.customizers?.scheduledEvent ?? defaultCustomizer, scheduledEventRecurrenceRule: _options.customizers?.scheduledEventRecurrenceRule ?? defaultCustomizer, sessionStartLimit: _options.customizers?.sessionStartLimit ?? defaultCustomizer, sharedClientTheme: _options.customizers?.sharedClientTheme ?? defaultCustomizer, sku: _options.customizers?.sku ?? defaultCustomizer, soundboardSound: _options.customizers?.soundboardSound ?? defaultCustomizer, stageInstance: _options.customizers?.stageInstance ?? defaultCustomizer, sticker: _options.customizers?.sticker ?? defaultCustomizer, stickerPack: _options.customizers?.stickerPack ?? defaultCustomizer, subscription: _options.customizers?.subscription ?? defaultCustomizer, team: _options.customizers?.team ?? defaultCustomizer, teamMember: _options.customizers?.teamMember ?? defaultCustomizer, template: _options.customizers?.template ?? defaultCustomizer, threadMember: _options.customizers?.threadMember ?? defaultCustomizer, threadMemberGuildCreate: _options.customizers?.threadMemberGuildCreate ?? defaultCustomizer, unfurledMediaItem: _options.customizers?.unfurledMediaItem ?? defaultCustomizer, user: _options.customizers?.user ?? defaultCustomizer, userPrimaryGuild: _options.customizers?.userPrimaryGuild ?? defaultCustomizer, voiceRegion: _options.customizers?.voiceRegion ?? defaultCustomizer, voiceState: _options.customizers?.voiceState ?? defaultCustomizer, webhook: _options.customizers?.webhook ?? defaultCustomizer, welcomeScreen: _options.customizers?.welcomeScreen ?? defaultCustomizer, widget: _options.customizers?.widget ?? defaultCustomizer, widgetSettings: _options.customizers?.widgetSettings ?? defaultCustomizer, }, desiredProperties: createDesiredPropertiesObject(_options.desiredProperties ?? {}), reverse: { activity: _options.reverse?.activity ?? transformActivityToDiscordActivity, activityAssets: _options.reverse?.activityAssets ?? transformActivityAssetsToDiscordActivityAssets, allowedMentions: _options.reverse?.allowedMentions ?? transformAllowedMentionsToDiscordAllowedMentions, application: _options.reverse?.application ?? transformApplicationToDiscordApplication, applicationCommand: _options.reverse?.applicationCommand ?? transformApplicationCommandToDiscordApplicationCommand, applicationCommandOption: _options.reverse?.applicationCommandOption ?? transformApplicationCommandOptionToDiscordApplicationCommandOption, applicationCommandOptionChoice: _options.reverse?.applicationCommandOptionChoice ?? transformApplicationCommandOptionChoiceToDiscordApplicationCommandOptionChoice, attachment: _options.reverse?.attachment ?? transformAttachmentToDiscordAttachment, collectibles: _options.reverse?.collectibles ?? transformCollectiblesToDiscordCollectibles, component: _options.reverse?.component ?? transformComponentToDiscordComponent, embed: _options.reverse?.embed ?? transformEmbedToDiscordEmbed, mediaGalleryItem: _options.reverse?.mediaGalleryItem ?? transformMediaGalleryItemToDiscordMediaGalleryItem, member: _options.reverse?.member ?? transformMemberToDiscordMember, nameplate: _options.reverse?.nameplate ?? transformNameplateToDiscordNameplate, snowflake: _options.reverse?.snowflake ?? bigintToSnowflake, team: _options.reverse?.team ?? transformTeamToDiscordTeam, unfurledMediaItem: _options.reverse?.unfurledMediaItem ?? transformUnfurledMediaItemToDiscordUnfurledMediaItem, user: _options.reverse?.user ?? transformUserToDiscordUser, }, activity: _options.activity ?? transformActivity, activityAssets: _options.activityAssets ?? transformActivityAssets, activityEmoji: _options.activityEmoji ?? transformActivityEmoji, activityInstance: _options.activityInstance ?? transformActivityInstance, activityLocation: _options.activityLocation ?? transformActivityLocation, application: _options.application ?? transformApplication, applicationCommand: _options.applicationCommand ?? transformApplicationCommand, applicationCommandOption: _options.applicationCommandOption ?? transformApplicationCommandOption, applicationCommandOptionChoice: _options.applicationCommandOptionChoice ?? transformApplicationCommandOptionChoice, applicationCommandPermissions: _options.applicationCommandPermissions ?? transformApplicationCommandPermissions, attachment: _options.attachment ?? transformAttachment, auditLogEntry: _options.auditLogEntry ?? transformAuditLogEntry, autoModerationAction: _options.autoModerationAction ?? transformAutoModerationAction, autoModerationActionExecution: _options.autoModerationActionExecution ?? transformAutoModerationActionExecution, autoModerationActionMetadata: _options.autoModerationActionMetadata ?? transformAutoModerationActionMetadata, autoModerationRule: _options.autoModerationRule ?? transformAutoModerationRule, autoModerationRuleTriggerMetadata: _options.autoModerationRuleTriggerMetadata ?? transformautoModerationRuleTriggerMetadata, avatarDecorationData: _options.avatarDecorationData ?? transformAvatarDecorationData, channel: _options.channel ?? transformChannel, collectibles: _options.collectibles ?? transformCollectibles, component: _options.component ?? transformComponent, defaultReactionEmoji: _options.defaultReactionEmoji ?? transformDefaultReactionEmoji, embed: _options.embed ?? transformEmbed, embedAuthor: _options.embedAuthor ?? transformEmbedAuthor, embedFooter: _options.embedFooter ?? transformEmbedFooter, embedImage: _options.embedImage ?? transformEmbedImage, embedVideo: _options.embedVideo ?? transformEmbedVideo, emoji: _options.emoji ?? transformEmoji, entitlement: _options.entitlement ?? transformEntitlement, forumTag: _options.forumTag ?? transformForumTag, gatewayBot: _options.gatewayBot ?? transformGatewayBot, guild: _options.guild ?? transformGuild, guildApplicationCommandPermissions: _options.guildApplicationCommandPermissions ?? transformGuildApplicationCommandPermissions, guildOnboarding: _options.guildOnboarding ?? transformGuildOnboarding, guildOnboardingPrompt: _options.guildOnboardingPrompt ?? transformGuildOnboardingPrompt, guildOnboardingPromptOption: _options.guildOnboardingPromptOption ?? transformGuildOnboardingPromptOption, incidentsData: _options.incidentsData ?? transformIncidentsData, integration: _options.integration ?? transformIntegration, integrationAccount: _options.integrationAccount ?? transformIntegrationAccount, integrationApplication: _options.integrationApplication ?? transformIntegrationApplication, interaction: _options.interaction ?? transformInteraction, interactionCallback: _options.interactionCallback ?? transformInteractionCallback, interactionCallbackResponse: _options.interactionCallbackResponse ?? transformInteractionCallbackResponse, interactionDataOption: _options.interactionDataOption ?? transformInteractionDataOption, interactionDataResolved: _options.interactionDataResolved ?? transformInteractionDataResolved, interactionResource: _options.interactionResource ?? transformInteractionResource, invite: _options.invite ?? transformInvite, inviteStageInstance: _options.inviteStageInstance ?? transformInviteStageInstance, lobby: _options.lobby ?? transformLobby, lobbyMember: _options.lobbyMember ?? transformLobbyMember, lobbyMessage: _options.lobbyMessage ?? transformLobbyMessage, lobbyInvite: _options.lobbyInvite ?? transformLobbyInvite, mediaGalleryItem: _options.mediaGalleryItem ?? transformMediaGalleryItem, member: _options.member ?? transformMember, message: _options.message ?? transformMessage, messageCall: _options.messageCall ?? transformMessageCall, messageInteractionMetadata: _options.messageInteractionMetadata ?? transformMessageInteractionMetadata, messagePin: _options.messagePin ?? transformMessagePin, messageSnapshot: _options.messageSnapshot ?? transformMessageSnapshot, nameplate: _options.nameplate ?? transformNameplate, optionalAuditEntryInfo: _options.optionalAuditEntryInfo ?? transformOptionalAuditEntryInfo, poll: _options.poll ?? transformPoll, pollMedia: _options.pollMedia ?? transformPollMedia, presence: _options.presence ?? transformPresence, role: _options.role ?? transformRole, roleColors: _options.roleColors ?? transformRoleColors, scheduledEvent: _options.scheduledEvent ?? transformScheduledEvent, scheduledEventRecurrenceRule: _options.scheduledEventRecurrenceRule ?? transformScheduledEventRecurrenceRule, sessionStartLimit: _options.sessionStartLimit ?? transformSessionStartLimit, sharedClientTheme: _options.sharedClientTheme ?? transformSharedClientTheme, sku: _options.sku ?? transformSku, soundboardSound: _options.soundboardSound ?? transformSoundboardSound, snowflake: _options.snowflake ?? snowflakeToBigint, stageInstance: _options.stageInstance ?? transformStageInstance, sticker: _options.sticker ?? transformSticker, stickerPack: _options.stickerPack ?? transformStickerPack, subscription: _options.subscription ?? transformSubscription, team: _options.team ?? transformTeam, teamMember: _options.teamMember ?? transformTeamMember, template: _options.template ?? transformTemplate, threadMember: _options.threadMember ?? transformThreadMember, threadMemberGuildCreate: _options.threadMemberGuildCreate ?? transformThreadMemberGuildCreate, unfurledMediaItem: _options.unfurledMediaItem ?? transformUnfurledMediaItem, user: _options.user ?? transformUser, userPrimaryGuild: _options.userPrimaryGuild ?? transformUserPrimaryGuild, voiceRegion: _options.voiceRegion ?? transformVoiceRegion, voiceState: _options.voiceState ?? transformVoiceState, webhook: _options.webhook ?? transformWebhook, welcomeScreen: _options.welcomeScreen ?? transformWelcomeScreen, widget: _options.widget ?? transformWidget, widgetSettings: _options.widgetSettings ?? transformWidgetSettings, } satisfies Transformers as unknown as Transformers; } /** * Information about a transformer including its payload and transformed types. * * @template TPayload - The type of the payload received from Discord. * @template TTransformed - The type of the transformed object returned by the transformer. * @template TPartial - Indicates if the transformer supports partial payloads. * @template TExtra - Additional extra information that might be needed for transformation. */ export type TransformerInformation = { payload: TPayload; transformed: TTransformed; extra: TExtra; partial: TPartial; }; /** * A function that transforms a payload from Discord into a desired format. * * @template TProps - The desired properties for the transformer. * @template TBehavior - The behavior for handling desired properties. * @template TPayload - The type of the payload received from Discord. * @template TTransformed - The type of the transformed object returned by the transformer. * @template TExtra - Additional extra information that might be needed for transformation. * @template TPartial - Indicates if the transformer supports partial payloads. */ export type TransformerFunction< TProps extends TransformersDesiredProperties, TBehavior extends DesiredPropertiesBehavior, TPayload, TTransformed, TExtra = {}, TPartial extends boolean = false, > = TPartial extends true ? // We use the method syntax for functions (...Params): ReturnType instead of the arrow syntax because it allows us to have overloads in the type { (bot: Bot, payload: TPayload, extra?: TExtra & { partial?: false }): SetupDesiredProps; ( bot: Bot, payload: Partial, extra: TExtra & { partial: true }, ): Partial>; } : // Even if we don't need to overload, since the 2 syntaxes have slightly different semantics, we use the method syntax in here as well { (bot: Bot, payload: TPayload, extra?: TExtra): SetupDesiredProps }; /** * A collection of transformer functions for various Discord entities. * * @template TProps - The desired properties for the transformers. * @template TBehavior - The behavior for handling desired properties. */ export type TransformerFunctions = { [K in keyof TransformerInformations]: TransformerFunction< TProps, TBehavior, TransformerInformations[K]['payload'], TransformerInformations[K]['transformed'], TransformerInformations[K]['extra'], TransformerInformations[K]['partial'] >; }; /** * A function that customizes the transformed object after the initial transformation. * * @template TProps - The desired properties for the transformer. * @template TBehavior - The behavior for handling desired properties. * @template TPayload - The type of the payload received from Discord. * @template TTransformed - The type of the transformed object returned by the transformer. * @template TExtra - Additional extra information that might be needed for customization. * @template TPartial - Indicates if the transformer supports partial payloads. */ export type TransformerCustomizerFunction< TProps extends TransformersDesiredProperties, TBehavior extends DesiredPropertiesBehavior, TPayload, TTransformed, TExtra = {}, TPartial extends boolean = false, > = TPartial extends true ? // We use the method syntax for functions (...Params): ReturnType instead of the arrow syntax because it allows us to have overloads in the type { ( bot: Bot, payload: TPayload, transformed: SetupDesiredProps, extra: TExtra & { partial: false }, ): any; ( bot: Bot, payload: Partial, transformed: Partial>, extra: TExtra & { partial: true }, ): any; } : // Even if we don't need to overload, since the 2 syntaxes have slightly different semantics, we use the method syntax in here as well { (bot: Bot, payload: TPayload, transformed: SetupDesiredProps, extra?: TExtra): any; }; /** * A collection of transformer customizer functions for various Discord entities. * * @template TProps - The desired properties for the transformers. * @template TBehavior - The behavior for handling desired properties. */ export type TransformerCustomizers = { [K in keyof TransformerInformations]: TransformerCustomizerFunction< TProps, TBehavior, TransformerInformations[K]['payload'], TransformerInformations[K]['transformed'], BigStringsToBigints, TransformerInformations[K]['partial'] >; }; /** * Converting BigString properties in T to bigint, leaving other properties unchanged. * * @template T - The object type to transform. */ export type BigStringsToBigints = { [K in keyof T]: BigString extends T[K] ? bigint : T[K]; }; /** * Calls a transformer customizer function with the provided parameters. * * @template TInfo - The key of the transformer information to use. * @param customizer - The key of the transformer information to use. * @param bot - The bot instance. * @param payload - The original payload from Discord. * @param transformed - The transformed object. * @param extra - Additional extra information for the customizer. * @returns The result of the customizer function. * * @remarks * This function is used because it is hard to deal with the customizer overloads directly in the transformers. * * Since the overloads are present only with partial transformers, this function requires the partial extra, for non-partial transformers the normal function call can be used */ export function callCustomizer( customizer: TInfo, bot: Bot, payload: TransformerInformations[TInfo]['payload'] | Partial, transformed: | SetupDesiredProps | Partial>, extra: TransformerInformations[TInfo]['extra'] & { partial: boolean }, ): any { // The type of the customizer is not generalizable, so we use unknown, callCustomizer has the correct type and we cast it here const customizerFn = bot.transformers.customizers[customizer] as (bot: Bot, payload: unknown, transformed: unknown, extra: unknown) => any; return customizerFn(bot, payload, transformed, extra); }