Skip to content

Commit

Permalink
typings(ApplicationCommandOptionData): Align command data options typ…
Browse files Browse the repository at this point in the history
…es more with discord API (#6247)

* types(ApplicationCommandData): align command data more with discord API

* types(ApplicationCommandData): clean up type definitions a bit

* types(ApplicationCommandData): fix issue where  could be used with  and

* types(ApplicationCommandOptionData): make subcommand option stronger

* test(ApplicationCommandOptionData): add typing tests
  • Loading branch information
suneettipirneni authored Aug 12, 2021
1 parent fff887b commit 297a911
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 8 deletions.
59 changes: 51 additions & 8 deletions typings/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2898,6 +2898,33 @@ export interface BaseApplicationCommandData {
defaultPermission?: boolean;
}

export type CommandOptionDataTypeResolvable = ApplicationCommandOptionType | ApplicationCommandOptionTypes;

export type CommandOptionChoiceResolvableType =
| ApplicationCommandOptionTypes.NUMBER
| 'NUMBER'
| ApplicationCommandOptionTypes.STRING
| 'STRING'
| ApplicationCommandOptionTypes.INTEGER
| 'INTEGER';

export type CommandOptionSubOptionResolvableType =
| ApplicationCommandOptionTypes.SUB_COMMAND
| 'SUB_COMMAND'
| ApplicationCommandOptionTypes.SUB_COMMAND_GROUP
| 'SUB_COMMAND_GROUP';

export type CommandOptionNonChoiceResolvableType = Exclude<
CommandOptionDataTypeResolvable,
CommandOptionChoiceResolvableType | CommandOptionSubOptionResolvableType
>;

export interface BaseApplicationCommandOptionsData {
name: string;
description: string;
required?: boolean;
}

export interface UserApplicationCommandData extends BaseApplicationCommandData {
type: 'USER' | ApplicationCommandTypes.USER;
}
Expand All @@ -2917,19 +2944,35 @@ export type ApplicationCommandData =
| MessageApplicationCommandData
| ChatInputApplicationCommandData;

export interface ApplicationCommandOptionData {
type: ApplicationCommandOptionType | ApplicationCommandOptionTypes;
name: string;
description: string;
required?: boolean;
export interface ApplicationCommandChoicesData extends BaseApplicationCommandOptionsData {
type: CommandOptionChoiceResolvableType;
choices?: ApplicationCommandOptionChoice[];
options?: ApplicationCommandOptionData[];
}

export interface ApplicationCommandOption extends ApplicationCommandOptionData {
export interface ApplicationCommandSubGroupData extends BaseApplicationCommandOptionsData {
type: 'SUB_COMMAND_GROUP' | ApplicationCommandOptionTypes.SUB_COMMAND_GROUP;
options?: ApplicationCommandSubCommandData[];
}

export interface ApplicationCommandSubCommandData extends BaseApplicationCommandOptionsData {
type: 'SUB_COMMAND' | ApplicationCommandOptionTypes.SUB_COMMAND;
options?: (ApplicationCommandChoicesData | ApplicationCommandNonOptionsData)[];
}

export interface ApplicationCommandNonOptionsData extends BaseApplicationCommandOptionsData {
type: CommandOptionNonChoiceResolvableType;
}

export type ApplicationCommandOptionData =
| ApplicationCommandSubGroupData
| ApplicationCommandNonOptionsData
| ApplicationCommandChoicesData
| ApplicationCommandSubCommandData;

export type ApplicationCommandOption = ApplicationCommandOptionData & {
type: ApplicationCommandOptionType;
options?: ApplicationCommandOption[];
}
};

export interface ApplicationCommandOptionChoice {
name: string;
Expand Down
42 changes: 42 additions & 0 deletions typings/tests.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
import {
ApplicationCommand,
ApplicationCommandChoicesData,
ApplicationCommandData,
ApplicationCommandManager,
ApplicationCommandNonOptionsData,
ApplicationCommandOptionData,
ApplicationCommandResolvable,
ApplicationCommandSubCommandData,
ApplicationCommandSubGroupData,
CacheFactory,
Caches,
CategoryChannel,
Expand All @@ -13,6 +18,8 @@ import {
CommandInteraction,
CommandInteractionOption,
CommandInteractionOptionResolver,
CommandOptionChoiceResolvableType,
CommandOptionNonChoiceResolvableType,
Constants,
DMChannel,
Guild,
Expand Down Expand Up @@ -56,6 +63,7 @@ import {
User,
VoiceChannel,
} from '.';
import { ApplicationCommandOptionTypes, ApplicationCommandTypes } from './enums';

const client: Client = new Client({
intents: Intents.FLAGS.GUILDS,
Expand Down Expand Up @@ -628,6 +636,40 @@ declare const applicationCommandManager: ApplicationCommandManager;
);
}

declare const applicationNonChoiceOptionData: ApplicationCommandOptionData & {
type: CommandOptionNonChoiceResolvableType;
};
{
// Options aren't allowed on this command type.

// @ts-expect-error
applicationNonChoiceOptionData.choices;
}

declare const applicationChoiceOptionData: ApplicationCommandOptionData & { type: CommandOptionChoiceResolvableType };
{
// Choices should be available.
applicationChoiceOptionData.choices;
}

declare const applicationSubGroupCommandData: ApplicationCommandSubGroupData;
{
assertType<'SUB_COMMAND_GROUP' | ApplicationCommandOptionTypes.SUB_COMMAND_GROUP>(
applicationSubGroupCommandData.type,
);
assertType<ApplicationCommandSubCommandData[] | undefined>(applicationSubGroupCommandData.options);
}

declare const applicationSubCommandData: ApplicationCommandSubCommandData;
{
assertType<'SUB_COMMAND' | ApplicationCommandOptionTypes.SUB_COMMAND>(applicationSubCommandData.type);

// Check that only subcommands can have no subcommand or subcommand group sub-options.
assertType<(ApplicationCommandChoicesData | ApplicationCommandNonOptionsData)[] | undefined>(
applicationSubCommandData.options,
);
}

declare const guildApplicationCommandManager: GuildApplicationCommandManager;
assertType<Promise<Collection<Snowflake, ApplicationCommand>>>(guildApplicationCommandManager.fetch());
assertType<Promise<Collection<Snowflake, ApplicationCommand>>>(guildApplicationCommandManager.fetch(undefined, {}));
Expand Down

0 comments on commit 297a911

Please sign in to comment.