import type { NovelConfig, ModulesOf } from '../types/config'; import type { BuiltinCmdMap } from '../types/dialogue'; import type { NovelModule } from './defineCmdUI'; type KeysOfUnion = T extends any ? keyof T : never; type GetProp = TCmd extends any ? K extends keyof TCmd ? TCmd[K] : never : never; type IsRequiredInAll = T extends any ? K extends keyof T ? {} extends Pick ? false : true : false : never; type IsRequired = false extends IsRequiredInAll ? false : true; type Flatten = { [K in KeysOfUnion as IsRequired extends true ? K : never]: GetProp; } & { [K in KeysOfUnion as IsRequired extends false ? K : never]?: GetProp; }; type MapKeysToTypes = { [I in keyof TKeys]: GetProp; }; type MakeOptional = T extends readonly [infer F, ...infer R] ? undefined extends F ? [F?, ...MakeOptional] : [F, ...MakeOptional] : []; type TargetCmdOf = TType extends keyof BuiltinCmdMap ? BuiltinCmdMap[TType] : TType extends keyof ModulesOf ? ModulesOf[TType] extends NovelModule ? TCmd : object : object; export interface ShortcutConfigReturn { | keyof ModulesOf) & string, const TKeys extends readonly (KeysOfUnion>)[], TReturn extends Flatten>>(type: TType, keys: TKeys, factory: (...args: MakeOptional, TKeys>>) => TReturn): (...args: MakeOptional, TKeys>>) => { type: TType; } & TargetCmdOf; | keyof ModulesOf) & string, TFactory extends (...args: any[]) => any>(type: TType, factory: TFactory): TFactory extends (...args: infer TArgs) => infer TReturn ? (...args: TArgs) => { type: TType; } & TReturn : TFactory; } export declare function shortcut>(config: TConfig): ShortcutConfigReturn; export declare function shortcut(type: TType): any>(factory: TFactory) => TFactory extends (...args: infer TArgs) => infer TReturn ? (...args: TArgs) => { type: TType; } & TReturn : TFactory; export {};