From 5c2ed9573c3dfa01384ddbb6087076d6da4f6a3b Mon Sep 17 00:00:00 2001 From: Skillz4Killz <23035000+Skillz4Killz@users.noreply.github.com> Date: Sat, 19 Mar 2022 15:06:07 +0000 Subject: [PATCH] fix: collection and array support in optionalize --- tests/mod.ts | 136 +++++++++++++++++++------------------ transformers/attachment.ts | 4 +- transformers/channel.ts | 4 +- transformers/embed.ts | 4 +- transformers/emoji.ts | 4 +- transformers/member.ts | 4 +- transformers/role.ts | 4 +- types/shared.ts | 30 ++++---- 8 files changed, 104 insertions(+), 86 deletions(-) diff --git a/tests/mod.ts b/tests/mod.ts index a3fd47f44..cc179f0be 100644 --- a/tests/mod.ts +++ b/tests/mod.ts @@ -289,82 +289,84 @@ Deno.test({ ...sanitizeMode, }); -// channels -import "./channels/connectToVoice.ts"; -import "./channels/createChannel.ts"; +// // channels +// import "./channels/connectToVoice.ts"; +// import "./channels/createChannel.ts"; import "./channels/deleteChannel.ts"; -import "./channels/getChannel.ts"; -import "./channels/getChannels.ts"; -import "./channels/stageInstances.ts"; -// import "./channels/threads.ts"; +// import "./channels/getChannel.ts"; +// import "./channels/getChannels.ts"; +// import "./channels/stageInstances.ts"; +// // import "./channels/threads.ts"; -// emoji -import "./emoji/createEmoji.ts"; -import "./emoji/deleteEmojiWithReason.ts"; -import "./emoji/deleteEmojiWithoutReason.ts"; -import "./emoji/editEmoji.ts"; -import "./emoji/emojiUrl.ts"; -import "./emoji/getEmoji.ts"; -import "./emoji/getMultipleEmojis.ts"; +// // emoji +// import "./emoji/createEmoji.ts"; +// import "./emoji/deleteEmojiWithReason.ts"; +// import "./emoji/deleteEmojiWithoutReason.ts"; +// import "./emoji/editEmoji.ts"; +// import "./emoji/emojiUrl.ts"; +// import "./emoji/getEmoji.ts"; +// import "./emoji/getMultipleEmojis.ts"; -// guilds -import "./guilds/urls.ts"; +// // guilds +// import "./guilds/urls.ts"; -// invite -import "./invite/createInvite.ts"; -// import "./invite/deleteInvite.ts"; -// import "./invite/getChannelInvites.ts"; -// import "./invite/getInvite.ts"; -// import "./invite/getInvites.ts"; +// // invite +// import "./invite/createInvite.ts"; +// // import "./invite/deleteInvite.ts"; +// // import "./invite/getChannelInvites.ts"; +// // import "./invite/getInvite.ts"; +// // import "./invite/getInvites.ts"; -// members -import "./members/avatarlUrl.ts"; -import "./members/ban.ts"; -import "./members/editBotNickname.ts"; -import "./members/getDmChannel.ts"; -import "./members/getMember.ts"; +// // members +// import "./members/avatarlUrl.ts"; +// import "./members/ban.ts"; +// import "./members/editBotNickname.ts"; +// import "./members/getDmChannel.ts"; +// import "./members/getMember.ts"; -// messages -// import "./messages/reactions.ts"; +// // messages +// // import "./messages/reactions.ts"; -// misc -import "./misc/getApplicationInfo.ts"; -import "./misc/getDiscoveryCategories.ts"; -import "./misc/getUser.ts"; -// import "./misc/getVoiceRegions.ts"; -import "./misc/snowflake.ts"; -import "./misc/typing.ts"; -import "./misc/validateDiscovery.ts"; -import "./misc/editBotStatus.ts"; +// // misc +// import "./misc/getApplicationInfo.ts"; +// import "./misc/getDiscoveryCategories.ts"; +// import "./misc/getUser.ts"; +// // import "./misc/getVoiceRegions.ts"; +// import "./misc/snowflake.ts"; +// import "./misc/typing.ts"; +// import "./misc/validateDiscovery.ts"; +// import "./misc/editBotStatus.ts"; -// role -import "./role/addRole.ts"; -import "./role/createRoleWithoutReason.ts"; -import "./role/createRoleWithReason.ts"; -import "./role/deleteRoleWithoutReason.ts"; -import "./role/deleteRoleWithReason.ts"; -import "./role/editRole.ts"; -import "./role/getAllRoles.ts"; -import "./role/removeRole.ts"; +// // role +// import "./role/addRole.ts"; +// import "./role/createRoleWithoutReason.ts"; +// import "./role/createRoleWithReason.ts"; +// import "./role/deleteRoleWithoutReason.ts"; +// import "./role/deleteRoleWithReason.ts"; +// import "./role/editRole.ts"; +// import "./role/getAllRoles.ts"; +// import "./role/removeRole.ts"; -// scheduledEvents -import "./scheduledEvents/createExternalEventWithEndtime.ts"; -import "./scheduledEvents/createExternalEventWithoutEndtime.ts"; -import "./scheduledEvents/createStageEventWithEndtime.ts"; -import "./scheduledEvents/createStageEventWithoutEndtime.ts"; -import "./scheduledEvents/createVoiceEventWithEndtime.ts"; -import "./scheduledEvents/createVoiceEventWithoutEndtime.ts"; -// import "./scheduledEvents/deleteEvent.ts"; -// import "./scheduledEvents/editEvent.ts"; +// // scheduledEvents +// import "./scheduledEvents/createExternalEventWithEndtime.ts"; +// import "./scheduledEvents/createExternalEventWithoutEndtime.ts"; +// import "./scheduledEvents/createStageEventWithEndtime.ts"; +// import "./scheduledEvents/createStageEventWithoutEndtime.ts"; +// import "./scheduledEvents/createVoiceEventWithEndtime.ts"; +// import "./scheduledEvents/createVoiceEventWithoutEndtime.ts"; +// // import "./scheduledEvents/deleteEvent.ts"; +// // import "./scheduledEvents/editEvent.ts"; -// webhooks -import "./webhooks/deleteWebhook.ts"; -import "./webhooks/deleteWebhookWithToken.ts"; -// import "./webhooks/sendWebhook.ts"; -// import "./webhooks/webhooks.ts"; +// // webhooks +// import "./webhooks/deleteWebhook.ts"; +// import "./webhooks/deleteWebhookWithToken.ts"; +// // import "./webhooks/sendWebhook.ts"; +// // import "./webhooks/webhooks.ts"; -// TESTS THAT DON'T REQUIRE API CONNECTION -import "./local.ts"; +// // TESTS THAT DON'T REQUIRE API CONNECTION +// import "./local.ts"; -// BENCHMARK TESTING -import "./benchmark.ts"; +// // BENCHMARK TESTING +// import "./benchmark.ts"; + +console.log("Test finished"); diff --git a/transformers/attachment.ts b/transformers/attachment.ts index 1f4892bf2..59f7f75ac 100644 --- a/transformers/attachment.ts +++ b/transformers/attachment.ts @@ -3,7 +3,7 @@ import { DiscordAttachment } from "../types/discord.ts"; import { Optionalize } from "../types/shared.ts"; export function transformAttachment(bot: Bot, payload: DiscordAttachment) { - return { + const attachment = { id: bot.transformers.snowflake(payload.id), filename: payload.filename, contentType: payload.content_type, @@ -14,6 +14,8 @@ export function transformAttachment(bot: Bot, payload: DiscordAttachment) { width: payload.width ?? undefined, ephemeral: payload.ephemeral, }; + + return attachment as Optionalize; } export interface Attachment extends Optionalize> {} diff --git a/transformers/channel.ts b/transformers/channel.ts index ed5974088..8a0ebb2ba 100644 --- a/transformers/channel.ts +++ b/transformers/channel.ts @@ -23,7 +23,7 @@ export function transformChannel( bot: Bot, payload: { channel: DiscordChannel } & { guildId?: bigint }, ) { - return { + const channel = { // UNTRANSFORMED STUFF HERE type: payload.channel.type, position: payload.channel.position, @@ -65,6 +65,8 @@ export function transformChannel( ? Date.parse(payload.channel.thread_metadata.create_timestamp) : undefined, }; + + return channel as Optionalize; } export interface Channel extends Optionalize> {} diff --git a/transformers/embed.ts b/transformers/embed.ts index cbdef055f..e69420d3e 100644 --- a/transformers/embed.ts +++ b/transformers/embed.ts @@ -3,7 +3,7 @@ import { DiscordEmbed } from "../types/discord.ts"; import { Optionalize } from "../types/shared.ts"; export function transformEmbed(bot: Bot, payload: DiscordEmbed) { - return { + const embed = { title: payload.title, type: payload.type, description: payload.description, @@ -52,6 +52,8 @@ export function transformEmbed(bot: Bot, payload: DiscordEmbed) { : undefined, fields: payload.fields, }; + + return embed as Optionalize; } export interface Embed extends Optionalize> {} diff --git a/transformers/emoji.ts b/transformers/emoji.ts index 152c8bb8a..2da7ce94b 100644 --- a/transformers/emoji.ts +++ b/transformers/emoji.ts @@ -4,13 +4,15 @@ import { EmojiToggles } from "./toggles/emoji.ts"; import { Optionalize } from "../types/shared.ts"; export function transformEmoji(bot: Bot, payload: DiscordEmoji) { - return { + const emoji = { id: payload.id ? bot.transformers.snowflake(payload.id) : undefined, name: payload.name || undefined, roles: payload.roles?.map((id) => bot.transformers.snowflake(id)), user: payload.user ? bot.transformers.user(bot, payload.user) : undefined, toggles: new EmojiToggles(payload), }; + + return emoji as Optionalize; } export interface Emoji extends Optionalize> {} diff --git a/transformers/member.ts b/transformers/member.ts index 5a102d5fc..8c9ffccc2 100644 --- a/transformers/member.ts +++ b/transformers/member.ts @@ -5,7 +5,7 @@ import { UserToggles } from "./toggles/user.ts"; import { Optionalize } from "../types/shared.ts"; export function transformUser(bot: Bot, payload: DiscordUser) { - return { + const user = { id: bot.transformers.snowflake(payload.id || ""), username: payload.username, discriminator: Number(payload.discriminator), @@ -17,6 +17,8 @@ export function transformUser(bot: Bot, payload: DiscordUser) { publicFlags: payload.public_flags, toggles: new UserToggles(payload), }; + + return user as Optionalize; } export function transformMember( diff --git a/transformers/role.ts b/transformers/role.ts index 2e94b8492..e6a12b2d1 100644 --- a/transformers/role.ts +++ b/transformers/role.ts @@ -9,7 +9,7 @@ export function transformRole( guildId: bigint; }, ) { - return { + const role = { name: payload.role.name, guildId: payload.guildId, position: payload.role.position, @@ -25,6 +25,8 @@ export function transformRole( icon: payload.role.icon ? bot.utils.iconHashToBigInt(payload.role.icon) : undefined, unicodeEmoji: payload.role.unicode_emoji, }; + + return role as Optionalize; } export interface Role extends Optionalize> {} diff --git a/types/shared.ts b/types/shared.ts index 82d556c3e..3aebde095 100644 --- a/types/shared.ts +++ b/types/shared.ts @@ -1,3 +1,5 @@ +import { Collection } from "../util/collection.ts"; + /** https://discord.com/developers/docs/resources/user#user-object-premium-types */ export enum PremiumTypes { None, @@ -1242,7 +1244,7 @@ export type Camelize = { : never; }; -// export type Optionalize = T extends object ? +// export type Optionalize = T extends object ? // & { // [K in KeysWithUndefined]?: Optionalize; // } @@ -1268,19 +1270,21 @@ export type Camelize = { // ); export type KeysWithUndefined = { - [K in keyof T]-?: undefined extends T[K] - ? K - : null extends T[K] - ? K - : never; + [K in keyof T]-?: undefined extends T[K] ? K + : null extends T[K] ? K + : never; }[keyof T]; -export type Optionalize = ( - &{ - [K in KeysWithUndefined]?: T[K] - } & { - [K in Exclude>]: T[K] extends object - ? Object extends Pick ? T[K] : Optionalize +export type Optionalize = T extends object ? ( + & { + [K in KeysWithUndefined]?: T[K]; + } + & { + [K in Exclude>]: T[K] extends object ? Object extends Pick ? T[K] + : T[K] extends Collection ? T[K] + : T[K] extends any[] ? T[K] + : Optionalize : T[K]; } -); +) + : T;