mirror of
https://github.com/discordeno/discordeno.git
synced 2026-06-03 09:20:08 +00:00
fix: collection and array support in optionalize
This commit is contained in:
136
tests/mod.ts
136
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");
|
||||
|
||||
@@ -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>> {}
|
||||
|
||||
@@ -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>> {}
|
||||
|
||||
@@ -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>> {}
|
||||
|
||||
@@ -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>> {}
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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>> {}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user