import type { CommandInteractionOptionResolver } from 'discord.js'; import type { PayloadType } from '../handler/structures/enums'; import type { InteractionReplyOptions, MessageReplyOptions } from 'discord.js'; import type { EventEmitter } from 'events'; import type { CommandModule, EventModule, AnyModule } from './module'; import type { UnpackFunction } from 'iti'; import type { ErrorHandling, Logging, ModuleManager } from '../handler/contracts'; import type { ModuleStore } from '../handler/structures/moduleStore'; import type SernEmitter from '../handler/sernEmitter'; import type { Container } from 'iti'; // Thanks to @kelsny export type ParseType = { [K in keyof T]: T[K] extends unknown ? [k: K, args: T[K]] : never; }[keyof T]; export type Args = ParseType<{ text: string[]; slash: SlashOptions }>; export type SlashOptions = Omit; /** * After modules are transformed, name and description are given default values if none * are provided to Module. This type represents that transformation */ export type AnyDefinedModule = Processed; export type Payload = | { type: PayloadType.Success; module: AnyModule } | { type: PayloadType.Failure; module?: AnyModule; reason: string | Error } | { type: PayloadType.Warning; reason: string }; export type SernEventsMapping = { 'module.register': [Payload]; 'module.activate': [Payload]; error: [Payload]; warning: [Payload]; }; export type LogPayload = { message: T }; export type Singleton = () => T; export type Transient = () => () => T; export interface Dependencies { '@sern/client': Singleton; '@sern/logger'?: Singleton; '@sern/emitter': Singleton; '@sern/store': Singleton; '@sern/modules': Singleton; '@sern/errors': Singleton; } export type ReplyOptions = | string | Omit | MessageReplyOptions; //prettier-ignore export type MapDeps = T extends [ infer First extends keyof Deps, ...infer Rest extends readonly unknown[], ] ? [ UnpackFunction, ...(MapDeps extends [never] ? [] : MapDeps), ] : [never]; //Basically, '@sern/client' | '@sern/store' | '@sern/modules' | '@sern/error' | '@sern/emitter' will be provided defaults, and you can exclude the rest export type OptionalDependencies = '@sern/logger'; export type Processed = T & { name: string; description: string }; export type Deprecated = [never, Message] export interface DependencyConfiguration { exclude?: Set; build: (root: Container, {}>) => Container }