From 193a5e9e20fc4832592b2a3b6f142752121f43d5 Mon Sep 17 00:00:00 2001 From: Vlad Frangu Date: Tue, 4 Feb 2025 16:06:46 +0200 Subject: [PATCH] types: fix recurrence rule types (#10694) * types: fix recurrence rule types * fix: endAt not endsAt * types: remove fields that cannot be set by the client * chore: cleanup JS lands too * chore: missed you * chore: bite me --------- Co-authored-by: Jiralite <33201955+Jiralite@users.noreply.github.com> --- .../managers/GuildScheduledEventManager.js | 3 - packages/discord.js/src/util/Transformers.js | 4 - packages/discord.js/typings/index.d.ts | 37 +++++--- packages/discord.js/typings/index.test-d.ts | 90 +++++++++++++++++++ 4 files changed, 117 insertions(+), 17 deletions(-) diff --git a/packages/discord.js/src/managers/GuildScheduledEventManager.js b/packages/discord.js/src/managers/GuildScheduledEventManager.js index 02e14c062..38d45adcb 100644 --- a/packages/discord.js/src/managers/GuildScheduledEventManager.js +++ b/packages/discord.js/src/managers/GuildScheduledEventManager.js @@ -41,15 +41,12 @@ class GuildScheduledEventManager extends CachedManager { * Options for setting a recurrence rule for a guild scheduled event. * @typedef {Object} GuildScheduledEventRecurrenceRuleOptions * @property {DateResolvable} startAt The time the recurrence rule interval starts at - * @property {?DateResolvable} endAt The time the recurrence rule interval ends at * @property {GuildScheduledEventRecurrenceRuleFrequency} frequency How often the event occurs * @property {number} interval The spacing between the events * @property {?GuildScheduledEventRecurrenceRuleWeekday[]} byWeekday The days within a week to recur on * @property {?GuildScheduledEventRecurrenceRuleNWeekday[]} byNWeekday The days within a week to recur on * @property {?GuildScheduledEventRecurrenceRuleMonth[]} byMonth The months to recur on * @property {?number[]} byMonthDay The days within a month to recur on - * @property {?number[]} byYearDay The days within a year to recur on - * @property {?number} count The total amount of times the event is allowed to recur before stopping */ /** diff --git a/packages/discord.js/src/util/Transformers.js b/packages/discord.js/src/util/Transformers.js index 491ec9e2f..8e4777731 100644 --- a/packages/discord.js/src/util/Transformers.js +++ b/packages/discord.js/src/util/Transformers.js @@ -63,16 +63,12 @@ function _transformAPIMessageInteractionMetadata(client, messageInteractionMetad function _transformGuildScheduledEventRecurrenceRule(recurrenceRule) { return { start: new Date(recurrenceRule.startAt).toISOString(), - // eslint-disable-next-line eqeqeq - end: recurrenceRule.endAt != null ? new Date(recurrenceRule.endAt).toISOString() : recurrenceRule.endAt, frequency: recurrenceRule.frequency, interval: recurrenceRule.interval, by_weekday: recurrenceRule.byWeekday, by_n_weekday: recurrenceRule.byNWeekday, by_month: recurrenceRule.byMonth, by_month_day: recurrenceRule.byMonthDay, - by_year_day: recurrenceRule.byYearDay, - count: recurrenceRule.count, }; } diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index 27200eb1e..2e4c48360 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -6378,18 +6378,35 @@ export interface GuildScheduledEventCreateOptions { recurrenceRule?: GuildScheduledEventRecurrenceRuleOptions; } -export interface GuildScheduledEventRecurrenceRuleOptions { +export type GuildScheduledEventRecurrenceRuleOptions = + | BaseGuildScheduledEventRecurrenceRuleOptions< + GuildScheduledEventRecurrenceRuleFrequency.Yearly, + { + byMonth: readonly GuildScheduledEventRecurrenceRuleMonth[]; + byMonthDay: readonly number[]; + } + > + | BaseGuildScheduledEventRecurrenceRuleOptions< + GuildScheduledEventRecurrenceRuleFrequency.Monthly, + { + byNWeekday: readonly GuildScheduledEventRecurrenceRuleNWeekday[]; + } + > + | BaseGuildScheduledEventRecurrenceRuleOptions< + GuildScheduledEventRecurrenceRuleFrequency.Weekly | GuildScheduledEventRecurrenceRuleFrequency.Daily, + { + byWeekday: readonly GuildScheduledEventRecurrenceRuleWeekday[]; + } + >; + +type BaseGuildScheduledEventRecurrenceRuleOptions< + Frequency extends GuildScheduledEventRecurrenceRuleFrequency, + Extra extends {}, +> = { startAt: DateResolvable; - endAt: DateResolvable; - frequency: GuildScheduledEventRecurrenceRuleFrequency; interval: number; - byWeekday: readonly GuildScheduledEventRecurrenceRuleWeekday[]; - byNWeekday: readonly GuildScheduledEventRecurrenceRuleNWeekday[]; - byMonth: readonly GuildScheduledEventRecurrenceRuleMonth[]; - byMonthDay: readonly number[]; - byYearDay: readonly number[]; - count: number; -} + frequency: Frequency; +} & Extra; export interface GuildScheduledEventEditOptions< Status extends GuildScheduledEventStatus, diff --git a/packages/discord.js/typings/index.test-d.ts b/packages/discord.js/typings/index.test-d.ts index a107c8549..fd9511ed9 100644 --- a/packages/discord.js/typings/index.test-d.ts +++ b/packages/discord.js/typings/index.test-d.ts @@ -33,6 +33,9 @@ import { APIMentionableSelectComponent, APIModalInteractionResponseCallbackData, WebhookType, + GuildScheduledEventRecurrenceRuleFrequency, + GuildScheduledEventRecurrenceRuleMonth, + GuildScheduledEventRecurrenceRuleWeekday, } from 'discord-api-types/v10'; import { ApplicationCommand, @@ -214,6 +217,7 @@ import { PollData, UserManager, InteractionCallbackResponse, + GuildScheduledEventRecurrenceRuleOptions, ThreadOnlyChannel, } from '.'; import { @@ -2690,3 +2694,89 @@ client.on('interactionCreate', interaction => { declare const guildScheduledEventManager: GuildScheduledEventManager; await guildScheduledEventManager.edit(snowflake, { recurrenceRule: null }); + +{ + expectNotAssignable({ + startAt: new Date(), + frequency: GuildScheduledEventRecurrenceRuleFrequency.Yearly, + interval: 1, + byMonth: [GuildScheduledEventRecurrenceRuleMonth.May], + byMonthDay: [4], + // Invalid property + byWeekday: [GuildScheduledEventRecurrenceRuleWeekday.Monday], + }); + + expectNotAssignable({ + startAt: new Date(), + frequency: GuildScheduledEventRecurrenceRuleFrequency.Yearly, + interval: 1, + byMonth: [GuildScheduledEventRecurrenceRuleMonth.May], + byMonthDay: [4], + // Invalid property + byNWeekday: [{ n: 1, day: GuildScheduledEventRecurrenceRuleWeekday.Monday }], + }); + + expectAssignable({ + startAt: new Date(), + frequency: GuildScheduledEventRecurrenceRuleFrequency.Yearly, + interval: 1, + byMonth: [GuildScheduledEventRecurrenceRuleMonth.May], + byMonthDay: [4], + }); +} + +{ + expectAssignable({ + startAt: new Date(), + frequency: GuildScheduledEventRecurrenceRuleFrequency.Monthly, + interval: 1, + byNWeekday: [{ n: 1, day: GuildScheduledEventRecurrenceRuleWeekday.Monday }], + }); + + expectNotAssignable({ + startAt: new Date(), + frequency: GuildScheduledEventRecurrenceRuleFrequency.Monthly, + interval: 1, + byNWeekday: [{ n: 1, day: GuildScheduledEventRecurrenceRuleWeekday.Monday }], + // Invalid property + byWeekday: [GuildScheduledEventRecurrenceRuleWeekday.Monday], + }); +} + +{ + expectAssignable({ + startAt: new Date(), + frequency: GuildScheduledEventRecurrenceRuleFrequency.Weekly, + interval: 1, + byWeekday: [GuildScheduledEventRecurrenceRuleWeekday.Monday], + }); + + expectNotAssignable({ + startAt: new Date(), + frequency: GuildScheduledEventRecurrenceRuleFrequency.Weekly, + interval: 1, + byWeekday: [GuildScheduledEventRecurrenceRuleWeekday.Monday], + // Invalid property + byNWeekday: [{ n: 1, day: GuildScheduledEventRecurrenceRuleWeekday.Monday }], + }); +} + +{ + expectNotAssignable({ + startAt: new Date(), + frequency: GuildScheduledEventRecurrenceRuleFrequency.Daily, + interval: 1, + byWeekday: [GuildScheduledEventRecurrenceRuleWeekday.Monday], + // Invalid property + byNWeekday: [{ n: 1, day: GuildScheduledEventRecurrenceRuleWeekday.Monday }], + }); + + expectNotAssignable({ + startAt: new Date(), + frequency: GuildScheduledEventRecurrenceRuleFrequency.Daily, + interval: 1, + byWeekday: [GuildScheduledEventRecurrenceRuleWeekday.Monday], + // Invalid property + byMonth: [GuildScheduledEventRecurrenceRuleMonth.May], + }); +}