import type { ObjectPrettify, Prettify, StringIsLiteral } from "typeforge"; import type { RestMethod } from "../../utils/utils.types"; import type { HttpResponse, RobloxCookie } from "../../http/http.utils"; import { OpenbloxConfig } from "../../config"; type ApiGroupProps = { name: string; baseUrl: `https://${string}`; defaultGetCursors?: (rawData: any) => ([previous: string | null, next: string | null]); }; export type CreateApiGroupFn = (props: ApiGroupProps) => { createApiMethod: AddApiMethodFn; addExistingApiMethod: >(method: Method) => Method; }; type ApiMethodCursorKeys = "cursor" | "startRowIndex" | "pageNumber"; type ApiMethodResponseFromMethod = ApiMethodResponse, Exclude, ArgsContainCursor>; type AddApiMethodFn = , MethodData extends ApiMethodData>(handlerFn: AddApiMethodHandlerFn) => (CallApiMethod); type ObjectIsLiteral> = ({ [Key in keyof Obj]: false; })["constructor"] extends false ? false : true; type CallApiMethodContext = { cookie?: RobloxCookie; cloudKey?: string; oauthToken?: string; } | void; type GetArgsContainsCursor> = ObjectIsLiteral extends true ? true extends StringIsLiteral> ? true : false : false; export type CallApiMethod, MethodData extends ApiMethodData, ArgsContainsCursor extends boolean = GetArgsContainsCursor> = (this: CallApiMethodContext | any, args: keyof Args extends undefined ? void : Args) => Promise>; export type ApiMethodDataFormatRawData = { formatRawDataFn: (rawData: RawData, response: HttpResponse) => FormattedData; }; export type Cursor = string | null | number | undefined; type ApiMethodData, _PrettifiedFormattedData = FormattedData extends undefined ? _PrettifiedRawData : Prettify> = { method: RestMethod; path: `/${string}`; name: string; searchParams?: Record | string; headers?: Record; body?: Record | string | number; formData?: FormData; applyFieldMask?: boolean; pathToPoll?: (rawData: RawData) => string; getCursorsFn?: (rawData: _PrettifiedRawData) => ([previous: Cursor, next: Cursor]); "🔒__PRIVATE_RAW_DATA"?: _PrettifiedRawData; "🔒__PRIVATE_FORMATTED_DATA"?: _PrettifiedFormattedData; } & (FormattedData extends undefined ? {} : ApiMethodDataFormatRawData); export type ApiMethod = Promise>; type AddApiMethodHandlerFn, MethodData extends ApiMethodData> = (args: Args) => Promise; export type ApiMethodResponse = ArgsContainsCursor extends false ? ApiMethodResponse_WithoutPagination & { again: () => Promise>; } : ApiMethodResponse_WithPagination & { again: () => Promise>; }; type ApiMethodResponse_WithoutPagination = ObjectPrettify<{ data: PrettifiedData; response: ObjectPrettify>; configUsed: OpenbloxConfig; }>; type ApiMethodResponse_WithPagination = ObjectPrettify & ((ArgsContainsCursor extends null ? { cursors?: { previous: Cursor; next: Cursor; }; [Symbol.asyncIterator]?: IsRoot extends false ? null : () => AsyncGenerator>; } : ArgsContainsCursor extends true ? { cursors: { previous: Cursor; next: Cursor; }; [Symbol.asyncIterator]: IsRoot extends false ? null : () => AsyncGenerator>; } : {}))>; export {};