fix: collection and array support in optionalize

This commit is contained in:
Skillz4Killz
2022-03-19 15:06:07 +00:00
committed by GitHub
parent 0e6c45b017
commit 5c2ed9573c
8 changed files with 104 additions and 86 deletions

View File

@@ -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");

View File

@@ -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<typeof attachment>;
}
export interface Attachment extends Optionalize<ReturnType<typeof transformAttachment>> {}

View File

@@ -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<typeof channel>;
}
export interface Channel extends Optionalize<ReturnType<typeof transformChannel>> {}

View File

@@ -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<typeof embed>;
}
export interface Embed extends Optionalize<ReturnType<typeof transformEmbed>> {}

View File

@@ -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<typeof emoji>;
}
export interface Emoji extends Optionalize<ReturnType<typeof transformEmoji>> {}

View File

@@ -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<typeof user>;
}
export function transformMember(

View File

@@ -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<typeof role>;
}
export interface Role extends Optionalize<ReturnType<typeof transformRole>> {}

View File

@@ -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<T> = {
: never;
};
// export type Optionalize<T> = T extends object ?
// export type Optionalize<T> = T extends object ?
// & {
// [K in KeysWithUndefined<T>]?: Optionalize<T[K]>;
// }
@@ -1268,19 +1270,21 @@ export type Camelize<T> = {
// );
export type KeysWithUndefined<T> = {
[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<T> = (
&{
[K in KeysWithUndefined<T>]?: T[K]
} & {
[K in Exclude<keyof T, KeysWithUndefined<T>>]: T[K] extends object
? Object extends Pick<T[K], keyof T[K]> ? T[K] : Optionalize<T[K]>
export type Optionalize<T> = T extends object ? (
& {
[K in KeysWithUndefined<T>]?: T[K];
}
& {
[K in Exclude<keyof T, KeysWithUndefined<T>>]: T[K] extends object ? Object extends Pick<T[K], keyof T[K]> ? T[K]
: T[K] extends Collection<any, any> ? T[K]
: T[K] extends any[] ? T[K]
: Optionalize<T[K]>
: T[K];
}
);
)
: T;