From 329ce54943ddde1538272c679a1e63d1aea38859 Mon Sep 17 00:00:00 2001 From: MARCROCK22 Date: Sun, 13 Oct 2024 21:33:02 +0000 Subject: [PATCH] fix: required options --- src/commands/applications/chat.ts | 38 +++++++----- src/commands/applications/options.ts | 89 ++++++++++++++++++---------- 2 files changed, 80 insertions(+), 47 deletions(-) diff --git a/src/commands/applications/chat.ts b/src/commands/applications/chat.ts index fb9282f..2bfd9c2 100644 --- a/src/commands/applications/chat.ts +++ b/src/commands/applications/chat.ts @@ -73,25 +73,33 @@ export type CommandOption = CommandOptionWithoutName & { name: string }; export type OptionsRecord = Record; type KeysWithoutRequired = { - [K in keyof T]-?: T[K]['required'] extends true ? never : K; + [K in keyof T]-?: NonNullable extends true ? never : K; }[keyof T]; +type ContextOptionsAuxInternal< + T extends CommandBaseOption & { + type: ApplicationCommandOptionType; + }, +> = T['value'] extends (...args: any) => any + ? Parameters[1]>[0] + : NonNullable extends (...args: any) => any + ? Parameters>[1]>[0] extends never + ? T extends SeyfertStringOption | SeyfertNumberOption + ? NonNullable extends SeyfertChoice[] + ? NonNullable[number]['value'] + : ReturnOptionsTypes[T['type']] + : ReturnOptionsTypes[T['type']] + : Parameters>[1]>[0] + : T extends SeyfertStringOption | SeyfertNumberOption + ? NonNullable extends SeyfertChoice[] + ? NonNullable[number]['value'] + : ReturnOptionsTypes[T['type']] + : ReturnOptionsTypes[T['type']]; + type ContextOptionsAux = { - [K in Exclude>]: T[K]['value'] extends (...args: any) => any - ? Parameters[1]>[0] - : T[K] extends SeyfertStringOption | SeyfertNumberOption - ? NonNullable extends SeyfertChoice[] - ? NonNullable[number]['value'] - : ReturnOptionsTypes[T[K]['type']] - : ReturnOptionsTypes[T[K]['type']]; + [K in Exclude>]: ContextOptionsAuxInternal; } & { - [K in KeysWithoutRequired]?: T[K]['value'] extends (...args: any) => any - ? Parameters[1]>[0] - : T[K] extends SeyfertStringOption | SeyfertNumberOption - ? NonNullable extends SeyfertChoice[] - ? NonNullable[number]['value'] - : ReturnOptionsTypes[T[K]['type']] - : ReturnOptionsTypes[T[K]['type']]; + [K in KeysWithoutRequired]?: ContextOptionsAuxInternal; }; export type ContextOptions = ContextOptionsAux; diff --git a/src/commands/applications/options.ts b/src/commands/applications/options.ts index 70ec2de..2c268f1 100644 --- a/src/commands/applications/options.ts +++ b/src/commands/applications/options.ts @@ -18,8 +18,8 @@ import { import type { CommandContext } from './chatcontext'; import type { DefaultLocale, MiddlewareContext, OKFunction, StopFunction } from './shared'; -export interface SeyfertBasicOption { - required?: boolean; +export interface SeyfertBasicOption { + required?: R; value?( data: { context: CommandContext; value: ReturnOptionsTypes[T] }, ok: OKFunction, @@ -37,10 +37,12 @@ export interface SeyfertBasicOption { export interface SeyfertBaseChoiceableOption< T extends keyof ReturnOptionsTypes, C = T extends ChoiceableTypes ? SeyfertChoice[] : never, + R = true | false, + VC = never, > { - required?: boolean; + required?: R; choices?: C; - value?: ValueCallback; + value?: ValueCallback; description: string; description_localizations?: APIApplicationCommandBasicOption['description_localizations']; name_localizations?: APIApplicationCommandBasicOption['name_localizations']; @@ -68,6 +70,7 @@ export interface ChoiceableValues { export type ValueCallback< T extends keyof ReturnOptionsTypes, C = T extends ChoiceableTypes ? SeyfertChoice[] : never, + I = any, > = ( data: { context: CommandContext; @@ -79,85 +82,107 @@ export type ValueCallback< : ReturnOptionsTypes[T] : ReturnOptionsTypes[T]; }, - ok: OKFunction, + ok: OKFunction, fail: StopFunction, ) => Awaitable; -export type SeyfertStringOption[]> = SeyfertBaseChoiceableOption< +export type SeyfertStringOption[], R = boolean, VC = never> = SeyfertBaseChoiceableOption< ApplicationCommandOptionType.String, - T + T, + R, + VC > & { autocomplete?: AutocompleteCallback; onAutocompleteError?: OnAutocompleteErrorCallback; min_length?: number; max_length?: number; }; -export type SeyfertIntegerOption[]> = SeyfertBaseChoiceableOption< +export type SeyfertIntegerOption[], R = boolean, VC = never> = SeyfertBaseChoiceableOption< ApplicationCommandOptionType.Integer, - T + T, + R, + VC > & { autocomplete?: AutocompleteCallback; onAutocompleteError?: OnAutocompleteErrorCallback; min_value?: number; max_value?: number; }; -export type SeyfertNumberOption[]> = SeyfertBaseChoiceableOption< +export type SeyfertNumberOption[], R = boolean, VC = never> = SeyfertBaseChoiceableOption< ApplicationCommandOptionType.Number, - T + T, + R, + VC > & { autocomplete?: AutocompleteCallback; onAutocompleteError?: OnAutocompleteErrorCallback; min_value?: number; max_value?: number; }; -export type SeyfertBooleanOption = SeyfertBasicOption; -export type SeyfertUserOption = SeyfertBasicOption; -export type SeyfertChannelOption = SeyfertBasicOption & { +export type SeyfertBooleanOption = SeyfertBasicOption; +export type SeyfertUserOption = SeyfertBasicOption; +export type SeyfertChannelOption = SeyfertBasicOption & { channel_types?: ChannelType[]; }; -export type SeyfertRoleOption = SeyfertBasicOption; -export type SeyfertMentionableOption = SeyfertBasicOption; -export type SeyfertAttachmentOption = SeyfertBasicOption; +export type SeyfertRoleOption = SeyfertBasicOption; +export type SeyfertMentionableOption = SeyfertBasicOption; +export type SeyfertAttachmentOption = SeyfertBasicOption; -export function createStringOption[] = SeyfertChoice[]>( - data: SeyfertStringOption, -) { +export function createStringOption< + R extends boolean, + C extends SeyfertChoice[] = SeyfertChoice[], + VC = never, +>(data: SeyfertStringOption) { return { ...data, type: ApplicationCommandOptionType.String } as const; } -export function createIntegerOption[] = SeyfertChoice[]>( - data: SeyfertIntegerOption, -) { +export function createIntegerOption< + R extends boolean, + C extends SeyfertChoice[] = SeyfertChoice[], + VC = never, +>(data: SeyfertIntegerOption) { return { ...data, type: ApplicationCommandOptionType.Integer } as const; } -export function createNumberOption[] = SeyfertChoice[]>( - data: SeyfertNumberOption, -) { +export function createNumberOption< + R extends boolean, + C extends SeyfertChoice[] = SeyfertChoice[], + VC = never, +>(data: SeyfertNumberOption) { return { ...data, type: ApplicationCommandOptionType.Number } as const; } -export function createBooleanOption(data: T) { +export function createBooleanOption = SeyfertBooleanOption>( + data: T, +) { return { ...data, type: ApplicationCommandOptionType.Boolean } as const; } -export function createUserOption(data: T) { +export function createUserOption = SeyfertUserOption>(data: T) { return { ...data, type: ApplicationCommandOptionType.User } as const; } -export function createChannelOption(data: T) { +export function createChannelOption = SeyfertChannelOption>( + data: T, +) { return { ...data, type: ApplicationCommandOptionType.Channel } as const; } -export function createRoleOption(data: T) { +export function createRoleOption = SeyfertRoleOption>(data: T) { return { ...data, type: ApplicationCommandOptionType.Role } as const; } -export function createMentionableOption(data: T) { +export function createMentionableOption< + R extends boolean, + T extends SeyfertMentionableOption = SeyfertMentionableOption, +>(data: T) { return { ...data, type: ApplicationCommandOptionType.Mentionable } as const; } -export function createAttachmentOption(data: T) { +export function createAttachmentOption< + R extends boolean, + T extends SeyfertAttachmentOption = SeyfertAttachmentOption, +>(data: T) { return { ...data, type: ApplicationCommandOptionType.Attachment } as const; }