import { Result } from '@sapphire/result';

declare class HttpError extends Error {
    readonly response: Response;
    readonly body: string;
    private json;
    constructor(response: Response, body: string);
    get url(): string;
    get code(): number;
    get jsonBody(): unknown;
}

type Awaitable<T> = PromiseLike<T> | T;
declare function safeFetch(input: RequestInfo | URL, init?: RequestInit): Promise<FetchResult<Response>>;
declare function safeTimedFetch(input: RequestInfo | URL, ms: number, init?: Omit<RequestInit, 'signal'>): Promise<FetchResult<Response>>;
declare function Text(result: Awaitable<FetchResult<Response>>): Promise<FetchResult<string>>;
declare function Json<T extends object>(result: Awaitable<FetchResult<Response>>): Promise<FetchResult<T>>;
declare function Blob(result: Awaitable<FetchResult<Response>>): Promise<FetchResult<Blob>>;
declare function ArrayBuffer(result: Awaitable<FetchResult<Response>>): Promise<FetchResult<ArrayBuffer>>;
declare function FormData(result: Awaitable<FetchResult<Response>>): Promise<FetchResult<FormData>>;
declare function isAbortError(error: Error): error is AbortError;
type AbortError = Error & {
    name: 'AbortError';
};
type FetchError = HttpError | AbortError;
type FetchResult<T> = Result<T, FetchError>;

export { type AbortError, ArrayBuffer, type Awaitable, Blob, type FetchError, type FetchResult, FormData, HttpError, Json, Text, isAbortError, safeFetch, safeTimedFetch };
