From ed70ee2403a68a18dab67fbf2ee6aad4befd5b32 Mon Sep 17 00:00:00 2001 From: didinele Date: Mon, 10 Aug 2026 15:20:43 +0300 Subject: [PATCH] refactor: split the classes --- packages/discord.js/typings/index.d.ts | 126 ++++++++++++++------ packages/discord.js/typings/index.test-d.ts | 29 ++++- 2 files changed, 114 insertions(+), 41 deletions(-) diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index 4b058394a..c16919a6b 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -448,12 +448,9 @@ export class ApplicationCommand extends Base { public nameLocalizations: LocalizationMap | null; public nameLocalized: string | null; public options: (ApplicationCommandOption & { descriptionLocalized?: string; nameLocalized?: string })[] | null; - public permissions: ApplicationCommandPermissionsManager< - PermissionsFetchType, - PermissionsFetchType, - Guild | null, - Snowflake - >; + public permissions: {} extends PermissionsFetchType + ? GuildApplicationCommandPermissionsManager + : ApplicationCommandPermissionsManager; public type: ApplicationCommandType; public version: Snowflake; public nsfw: boolean; @@ -4233,18 +4230,13 @@ export type ApplicationCommandDataResolvable = export class ApplicationCommandManager< ApplicationCommandScope = ApplicationCommand<{ guild: GuildResolvable }>, - PermissionsOptionsExtras = { guild: GuildResolvable }, - PermissionsGuildType = null, + PermissionsManager = ApplicationCommandPermissionsManager, > extends CachedManager { protected constructor(client: Client, iterable?: Iterable); - public permissions: ApplicationCommandPermissionsManager< - PermissionsOptionsExtras & { command?: ApplicationCommandResolvable }, - PermissionsOptionsExtras & { command: ApplicationCommandResolvable }, - PermissionsGuildType, - null - >; + public permissions: PermissionsManager; private commandPath({ id, guildId }: { guildId?: Snowflake; id?: Snowflake }): string; - public create(command: ApplicationCommandDataResolvable, guildId?: Snowflake): Promise; + public create(command: ApplicationCommandDataResolvable): Promise; + public create(command: ApplicationCommandDataResolvable, guildId: Snowflake): Promise; public delete(command: ApplicationCommandResolvable, guildId?: Snowflake): Promise; public edit( command: ApplicationCommandResolvable, @@ -4274,46 +4266,52 @@ export class ApplicationCommandManager< private static transformCommand(command: ApplicationCommandDataResolvable): RESTPostAPIApplicationCommandsJSONBody; } -export class ApplicationCommandPermissionsManager< - BaseOptions, - FetchSingleOptions, - GuildType, - CommandIdType, -> extends BaseManager { - private constructor(manager: ApplicationCommand | ApplicationCommandManager | GuildApplicationCommandManager); - private readonly manager: ApplicationCommand | ApplicationCommandManager | GuildApplicationCommandManager; +export type ApplicationCommandPermissionsCommandOptions = + CommandIdType extends null ? { command: ApplicationCommandResolvable } : {}; + +export type ApplicationCommandPermissionsFetchAllOptions = + CommandIdType extends null ? { command?: ApplicationCommandResolvable } : {}; + +export type ApplicationCommandPermissionsFetchAllResult = + CommandIdType extends null ? Collection : ApplicationCommandPermissions[]; + +export class GuildApplicationCommandPermissionsManager extends BaseManager { + private constructor(manager: ApplicationCommand | GuildApplicationCommandManager); + private readonly manager: ApplicationCommand | GuildApplicationCommandManager; public commandId: CommandIdType; - public guild: GuildType; - public guildId: Snowflake | null; + public guild: CommandIdType extends null ? Guild : Guild | null; + public guildId: Snowflake; public add( - options: EditApplicationCommandPermissionsMixin & FetchSingleOptions, + options: ApplicationCommandPermissionsCommandOptions & EditApplicationCommandPermissionsMixin, ): Promise; public has( - options: FetchSingleOptions & { + options: ApplicationCommandPermissionsCommandOptions & { permissionId: ApplicationCommandPermissionIdResolvable; permissionType?: ApplicationCommandPermissionType; }, ): Promise; - public fetch(options: FetchSingleOptions): Promise; public fetch( - ...args: {} extends BaseOptions ? [] | [BaseOptions] : [BaseOptions] - ): Promise>; + options: ApplicationCommandPermissionsCommandOptions, + ): Promise; + public fetch( + options?: ApplicationCommandPermissionsFetchAllOptions, + ): Promise>; public remove( options: - | (FetchSingleOptions & { + | (ApplicationCommandPermissionsCommandOptions & { channels: readonly (ChannelPermissionConstant | GuildChannelResolvable)[]; roles?: readonly (RolePermissionConstant | RoleResolvable)[]; token: string; users?: readonly UserResolvable[]; }) - | (FetchSingleOptions & { + | (ApplicationCommandPermissionsCommandOptions & { channels?: readonly (ChannelPermissionConstant | GuildChannelResolvable)[]; roles: readonly (RolePermissionConstant | RoleResolvable)[]; token: string; users?: readonly UserResolvable[]; }) - | (FetchSingleOptions & { + | (ApplicationCommandPermissionsCommandOptions & { channels?: readonly (ChannelPermissionConstant | GuildChannelResolvable)[]; roles?: readonly (RolePermissionConstant | RoleResolvable)[]; token: string; @@ -4321,7 +4319,62 @@ export class ApplicationCommandPermissionsManager< }), ): Promise; public set( - options: EditApplicationCommandPermissionsMixin & FetchSingleOptions, + options: ApplicationCommandPermissionsCommandOptions & EditApplicationCommandPermissionsMixin, + ): Promise; + private permissionsPath(guildId: Snowflake, commandId?: Snowflake): string; +} + +export class ApplicationCommandPermissionsManager extends BaseManager { + private constructor(manager: ApplicationCommand | ApplicationCommandManager); + private readonly manager: ApplicationCommand | ApplicationCommandManager; + + public commandId: CommandIdType; + public guild: null; + public guildId: null; + public add( + options: ApplicationCommandPermissionsCommandOptions & + EditApplicationCommandPermissionsMixin & { guild: GuildResolvable }, + ): Promise; + public has( + options: ApplicationCommandPermissionsCommandOptions & { + guild: GuildResolvable; + permissionId: ApplicationCommandPermissionIdResolvable; + permissionType?: ApplicationCommandPermissionType; + }, + ): Promise; + public fetch( + options: ApplicationCommandPermissionsCommandOptions & { guild: GuildResolvable }, + ): Promise; + public fetch( + options: ApplicationCommandPermissionsFetchAllOptions & { guild: GuildResolvable }, + ): Promise>; + public remove( + options: + | (ApplicationCommandPermissionsCommandOptions & { + channels: readonly (ChannelPermissionConstant | GuildChannelResolvable)[]; + guild: GuildResolvable; + roles?: readonly (RolePermissionConstant | RoleResolvable)[]; + token: string; + users?: readonly UserResolvable[]; + }) + | (ApplicationCommandPermissionsCommandOptions & { + channels?: readonly (ChannelPermissionConstant | GuildChannelResolvable)[]; + guild: GuildResolvable; + roles: readonly (RolePermissionConstant | RoleResolvable)[]; + token: string; + users?: readonly UserResolvable[]; + }) + | (ApplicationCommandPermissionsCommandOptions & { + channels?: readonly (ChannelPermissionConstant | GuildChannelResolvable)[]; + guild: GuildResolvable; + roles?: readonly (RolePermissionConstant | RoleResolvable)[]; + token: string; + users: readonly UserResolvable[]; + }), + ): Promise; + public set( + options: ApplicationCommandPermissionsCommandOptions & + EditApplicationCommandPermissionsMixin & { guild: GuildResolvable }, ): Promise; private permissionsPath(guildId: Snowflake, commandId?: Snowflake): string; } @@ -4432,7 +4485,10 @@ export interface FetchGuildApplicationCommandFetchOptions extends BaseFetchOptio withLocalizations?: boolean; } -export class GuildApplicationCommandManager extends ApplicationCommandManager { +export class GuildApplicationCommandManager extends ApplicationCommandManager< + ApplicationCommand, + GuildApplicationCommandPermissionsManager +> { private constructor(guild: Guild, iterable?: Iterable); public guild: Guild; public create(command: ApplicationCommandDataResolvable): Promise; diff --git a/packages/discord.js/typings/index.test-d.ts b/packages/discord.js/typings/index.test-d.ts index 8882e5f29..b67f0d3a4 100644 --- a/packages/discord.js/typings/index.test-d.ts +++ b/packages/discord.js/typings/index.test-d.ts @@ -221,6 +221,7 @@ import type { AuthorizingIntegrationOwners, VoiceServerUpdateData, ApplicationCommandPermissions, + GuildApplicationCommandPermissionsManager, } from './index.js'; import { Client, @@ -1618,6 +1619,15 @@ declare const applicationCommandManager: ApplicationCommandManager; applicationCommandManager.set([applicationCommandData] as const, '0'), ); + expectType>( + applicationCommandManager.permissions.fetch({ guild: '0', command: '0' }), + ); + expectType>>( + applicationCommandManager.permissions.fetch({ guild: '0' }), + ); + // @ts-expect-error A global manager has no guild of its own to fall back on. + await applicationCommandManager.permissions.fetch(); + // Test inference of choice values. if ('choices' in applicationCommandOptionData) { if (applicationCommandOptionData.type === ApplicationCommandOptionType.String) { @@ -1637,12 +1647,7 @@ declare const applicationCommandManager: ApplicationCommandManager; } } -declare const applicationCommandPermissionsManager: ApplicationCommandPermissionsManager< - {}, - {}, - Guild | null, - Snowflake ->; +declare const applicationCommandPermissionsManager: GuildApplicationCommandPermissionsManager; { await applicationCommandPermissionsManager.add({ permissions: [], token: '' }); await applicationCommandPermissionsManager.add({ permissions: [] as const, token: '' }); @@ -1656,6 +1661,18 @@ declare const applicationCommandPermissionsManager: ApplicationCommandPermission users: [] as const, token: '', }); + + expectType>(applicationCommandPermissionsManager.fetch()); + expectType>(applicationCommandPermissionsManager.fetch({})); +} + +declare const globalApplicationCommandPermissionsManager: ApplicationCommandPermissionsManager; +{ + expectType>( + globalApplicationCommandPermissionsManager.fetch({ guild: '0' }), + ); + // @ts-expect-error + await globalApplicationCommandPermissionsManager.fetch(); } declare const chatInputApplicationCommandData: ChatInputApplicationCommandData;