Something went wrong. Try again.
Mirror: A Node.js fetch shim using built-in Request, Response, and Headers (but without native fetch)
Something went wrong. Try again.
4.0 kB · 125 lines
TypeScript
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126import * as buffer from 'node:buffer';
type Or<T, U> = void extends T ? U : T;
export type HeadersInit = | string[][] | Record<string, string | ReadonlyArray<string>> | _Headers;
export type FormDataEntryValue = string | _File;
export type RequestInfo = string | _URL | _Request;
interface _Iterable<T, TReturn = any, TNext = any> extends Or< Iterable<T, TReturn, TNext>, globalThis.Iterable<T, TReturn, TNext> > {}interface _AsyncIterable<T, TReturn = any, TNext = any> extends Or< AsyncIterable<T, TReturn, TNext>, globalThis.AsyncIterable<T, TReturn, TNext> > {}interface _ReadableStream<T = any> extends Or<ReadableStream<T>, globalThis.ReadableStream<T>> {}
// NOTE: AsyncIterable<Uint8Array> is left outexport type BodyInit = | ArrayBuffer | _Blob | NodeJS.ArrayBufferView | _URLSearchParams | _ReadableStream | _AsyncIterable<Uint8Array> | _FormData | _Iterable<Uint8Array> | null | string;
// See: https://nodejs.org/docs/latest-v20.x/api/globals.html#class-file// The `File` global was only added in Node.js 20interface _File extends _Blob, Or<File, globalThis.File> { readonly name: string; readonly lastModified: number;}interface _File extends Or<globalThis.File, buffer.File> {}interface FileClass extends Or<typeof globalThis.File, typeof buffer.File> {}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<RequestInit, globalThis.RequestInit> { connectTimeout?: number; duplex?: 'half';}interface _ResponseInit extends Or<ResponseInit, globalThis.ResponseInit> {}
interface _Blob extends Or<Blob, globalThis.Blob> {}interface BlobClass extends Or<typeof Blob, typeof globalThis.Blob> {}const _Blob: BlobClass = Blob;
interface _URLSearchParams extends Or<URLSearchParams, globalThis.URLSearchParams> {}interface URLSearchParamsClass extends Or<typeof URLSearchParams, typeof globalThis.URLSearchParams> {}const _URLSearchParams: URLSearchParamsClass = URLSearchParams as any;
interface _URL extends Or<URL, globalThis.URL> {}interface URLClass extends Or<typeof URL, typeof globalThis.URL> {}const _URL: URLClass = URL;
interface _Request extends Or<Request, globalThis.Request> {}interface RequestClass extends Or<typeof Request, typeof globalThis.Request> { new ( input: RequestInfo, init?: _RequestInit | Or<RequestInit, globalThis.RequestInit> ): _Request;}
interface _Response extends Or<Response, globalThis.Response> {}interface ResponseClass extends Or<typeof Response, typeof globalThis.Response> { new (body?: BodyInit, init?: _ResponseInit): _Response;}
interface _Headers extends Or<Headers, globalThis.Headers> {}interface HeadersClass extends Or<typeof Headers, typeof globalThis.Headers> { new (init?: HeadersInit): _Headers;}
interface _FormData extends Or< FormData & _Iterable<[string, FormDataEntryValue]>, globalThis.FormData > {}interface FormDataClass extends Or<typeof FormData, typeof globalThis.FormData> {}
let _Request: RequestClass;let _Response: ResponseClass;let _Headers: HeadersClass;let _FormData: FormDataClass;if (typeof Request !== 'undefined') _Request = Request;if (typeof Response !== 'undefined') _Response = Response;if (typeof Headers !== 'undefined') _Headers = Headers;if (typeof FormData !== 'undefined') _FormData = 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,};