import * as buffer from 'node:buffer'; type Or = void extends T ? U : T; export type HeadersInit = | string[][] | Record> | _Headers; export type FormDataEntryValue = string | _File; export type RequestInfo = string | _URL | _Request; interface _Iterable extends Or< Iterable, globalThis.Iterable > {} interface _AsyncIterable extends Or< AsyncIterable, globalThis.AsyncIterable > {} interface _ReadableStream extends Or, globalThis.ReadableStream> {} // NOTE: AsyncIterable is left out export type BodyInit = | ArrayBuffer | _Blob | NodeJS.ArrayBufferView | _URLSearchParams | _ReadableStream | _AsyncIterable | _FormData | _Iterable | null | string; // See: https://nodejs.org/docs/latest-v20.x/api/globals.html#class-file // The `File` global was only added in Node.js 20 interface _File extends _Blob, Or { readonly name: string; readonly lastModified: number; } interface _File extends Or {} interface FileClass extends Or {} const _File: FileClass = globalThis.File || buffer.File; if (typeof globalThis.File === 'undefined') { globalThis.File = _File; } // There be dragons here. // This is complex because of overlapping definitions in lib.dom, @types/node, and undici-types // Some types define and overload constructor interfaces with type interfaces // Here, we have to account for global differences and split the overloads apart interface _RequestInit extends Or { duplex?: 'half'; } interface _ResponseInit extends Or {} interface _Blob extends Or {} interface BlobClass extends Or {} const _Blob: BlobClass = Blob; interface _URLSearchParams extends Or {} interface URLSearchParamsClass extends Or {} const _URLSearchParams: URLSearchParamsClass = URLSearchParams as any; interface _URL extends Or {} interface URLClass extends Or {} const _URL: URLClass = URL; interface _Request extends Or {} interface RequestClass extends Or { new ( input: RequestInfo, init?: _RequestInit | Or ): _Request; } const _Request: RequestClass = Request; interface _Response extends Or {} interface ResponseClass extends Or { new (body?: BodyInit, init?: _ResponseInit): _Response; } const _Response: ResponseClass = Response; interface _Headers extends Or {} interface HeadersClass extends Or { new (init?: HeadersInit): _Headers; } const _Headers: HeadersClass = Headers; interface _FormData extends Or< FormData & _Iterable<[string, FormDataEntryValue]>, globalThis.FormData > {} interface FormDataClass extends Or {} const _FormData: FormDataClass = FormData; export { type _RequestInit as RequestInit, type _ResponseInit as ResponseInit, _Blob as Blob, _File as File, _URL as URL, _URLSearchParams as URLSearchParams, _Request as Request, _Response as Response, _Headers as Headers, _FormData as FormData, };