export type HttpMethod = 'get' | 'post' | 'put' | 'delete' | 'patch' | 'head'; export type RawArgType = Record | Record[] | undefined; export interface BasicAPICallT< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse > { (args: ArgType): Promise; (args: ArgType, returnError: false): Promise; (args: ArgType, returnError: true): Promise; readonly reqType: HttpMethod; } export type BasicGetAPICallT< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse > = BasicAPICallT & { readonly reqType: 'get' }; export type BasicPostAPICallT< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse > = BasicAPICallT & { readonly reqType: 'post' }; export type BasicPutAPICallT< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse > = BasicAPICallT & { readonly reqType: 'put' }; export type BasicDeleteAPICallT< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse > = BasicAPICallT & { readonly reqType: 'delete' }; export type BasicPatchAPICallT< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse > = BasicAPICallT & { readonly reqType: 'patch' }; export type BasicHeadAPICallT< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse > = BasicAPICallT & { readonly reqType: 'head' }; export interface EmptyAPICallT { (): Promise; (args?: undefined): Promise; (args: undefined, returnError: false): Promise; (args: undefined, returnError: true): Promise; readonly reqType: HttpMethod; } export type EmptyGetAPICallT< ResultType extends ValidResponse, ErrorType extends InvalidResponse > = EmptyAPICallT & { readonly reqType: 'get' }; export type EmptyPostAPICallT< ResultType extends ValidResponse, ErrorType extends InvalidResponse > = EmptyAPICallT & { readonly reqType: 'post' }; export type EmptyPutAPICallT< ResultType extends ValidResponse, ErrorType extends InvalidResponse > = EmptyAPICallT & { readonly reqType: 'put' }; export type EmptyDeleteAPICallT< ResultType extends ValidResponse, ErrorType extends InvalidResponse > = EmptyAPICallT & { readonly reqType: 'delete' }; export type EmptyPatchAPICallT< ResultType extends ValidResponse, ErrorType extends InvalidResponse > = EmptyAPICallT & { readonly reqType: 'patch' }; export type EmptyHeadAPICallT< ResultType extends ValidResponse, ErrorType extends InvalidResponse > = EmptyAPICallT & { readonly reqType: 'head' }; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type ArgTypeOf = T extends APICallT ? A : never; export type APICallT< ArgType extends RawArgType, ResultType extends ValidResponse = ValidResponse, ErrorType extends InvalidResponse = InvalidResponse > = ArgType extends undefined ? EmptyAPICallT : BasicAPICallT; export type GetAPICallT< ArgType extends RawArgType, ResultType extends ValidResponse = ValidResponse, ErrorType extends InvalidResponse = InvalidResponse > = ArgType extends undefined ? EmptyGetAPICallT : BasicGetAPICallT; export type PostAPICallT< ArgType extends RawArgType, ResultType extends ValidResponse = ValidResponse, ErrorType extends InvalidResponse = InvalidResponse > = ArgType extends undefined ? EmptyPostAPICallT : BasicPostAPICallT; export type PutAPICallT< ArgType extends RawArgType, ResultType extends ValidResponse = ValidResponse, ErrorType extends InvalidResponse = InvalidResponse > = ArgType extends undefined ? EmptyPutAPICallT : BasicPutAPICallT; export type DeleteAPICallT< ArgType extends RawArgType, ResultType extends ValidResponse = ValidResponse, ErrorType extends InvalidResponse = InvalidResponse > = ArgType extends undefined ? EmptyDeleteAPICallT : BasicDeleteAPICallT; export type PatchAPICallT< ArgType extends RawArgType, ResultType extends ValidResponse = ValidResponse, ErrorType extends InvalidResponse = InvalidResponse > = ArgType extends undefined ? EmptyPatchAPICallT : BasicPatchAPICallT; export type HeadAPICallT< ArgType extends RawArgType, ResultType extends ValidResponse = ValidResponse, ErrorType extends InvalidResponse = InvalidResponse > = ArgType extends undefined ? EmptyHeadAPICallT : BasicHeadAPICallT; export type APITail = ReturnType | ReturnType | ReturnType | ReturnType | ReturnType | ReturnType; export function GET< ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): EmptyGetAPICallT export function GET< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): BasicGetAPICallT; export function GET< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): BasicGetAPICallT | EmptyGetAPICallT { return Object.assign( fakeGET, { reqType: 'get' } as const ) } export function POST< ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): EmptyPostAPICallT export function POST< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): BasicPostAPICallT; export function POST< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): BasicPostAPICallT | EmptyPostAPICallT { return Object.assign( fakePOST, { reqType: 'post' } as const ) } export function PUT< ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): EmptyPutAPICallT export function PUT< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): BasicPutAPICallT; export function PUT< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): BasicPutAPICallT | EmptyPutAPICallT { return Object.assign( fakePUT, { reqType: 'put' } as const ) } export function DELETE< ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): EmptyDeleteAPICallT export function DELETE< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): BasicDeleteAPICallT; export function DELETE< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): BasicDeleteAPICallT | EmptyDeleteAPICallT { return Object.assign( fakeDELETE, { reqType: 'delete' } as const ) } export function PATCH< ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): EmptyPatchAPICallT export function PATCH< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): BasicPatchAPICallT; export function PATCH< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): BasicPatchAPICallT | EmptyPatchAPICallT { return Object.assign( fakePATCH, { reqType: 'patch' } as const ) } export function HEAD< ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): EmptyHeadAPICallT export function HEAD< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): BasicHeadAPICallT; export function HEAD< ArgType extends RawArgType, ResultType extends ValidResponse, ErrorType extends InvalidResponse, >(): BasicHeadAPICallT | EmptyHeadAPICallT { return Object.assign( fakeHEAD, { reqType: 'head' } as const ) } export async function fakeGET< ResultType extends ValidResponse, ErrorType extends InvalidResponse, ArgType extends undefined = undefined >(args?: ArgType, returnError = false): Promise { throw `Can't directly call GET. ${args}, ${returnError}. Use auto-generated path API.` } export async function fakePOST< ResultType extends ValidResponse, ErrorType extends InvalidResponse, ArgType extends RawArgType = undefined >(args: ArgType, returnError = false): Promise { throw `Can't directly call POST. ${args}, ${returnError}. Use auto-generated path API.` } export async function fakePUT< ResultType extends ValidResponse, ErrorType extends InvalidResponse, ArgType extends RawArgType = undefined >(args: ArgType, returnError = false): Promise { throw `Can't directly call PUT. ${args}, ${returnError}. Use auto-generated path API.`; } export async function fakeDELETE< ResultType extends ValidResponse, ErrorType extends InvalidResponse, ArgType extends RawArgType = undefined >(args: ArgType, returnError = false): Promise { throw `Can't directly call DELETE. ${args}, ${returnError}. Use auto-generated path API.`; } export async function fakePATCH< ResultType extends ValidResponse, ErrorType extends InvalidResponse, ArgType extends RawArgType = undefined >(args: ArgType, returnError = false): Promise { throw `Can't directly call PATCH. ${args}, ${returnError}. Use auto-generated path API.` } export async function fakeHEAD< ResultType extends ValidResponse, ErrorType extends InvalidResponse, ArgType extends RawArgType = undefined >(args?: ArgType, returnError = false): Promise { throw `Can't directly call HEAD. ${args}, ${returnError}. Use auto-generated path API.`; } export interface ValidResponse { result: true; } export type recoveryMethod = 'refreshEntirePage' | 'retryAPI' | 'gameLogin' | 'gatewayLogin' | 'gateway2FA' | 'gameQuota'; export interface InvalidResponse { result: false; reason: string; recovery?: recoveryMethod; } type ExtractValid = T extends ValidResponse ? T : never; type ExtractInvalid = T extends InvalidResponse ? T : never; export type Callable = (...args: any) => any; export type ExtractResponse = ExtractValid>>; export type ExtractError = ExtractInvalid>>; export type ExtractQuery = Parameters[0]; export type DefAPINamespace = { [key: string]: DefAPINamespace | BasicGetAPICallT | BasicPostAPICallT | BasicPutAPICallT | BasicDeleteAPICallT | BasicPatchAPICallT | BasicHeadAPICallT | EmptyGetAPICallT | EmptyPostAPICallT | EmptyPutAPICallT | EmptyDeleteAPICallT | EmptyPatchAPICallT | EmptyHeadAPICallT ; } export type APICompatType = T extends APICallT ? APICallT : never;