import fetch, { Response, RequestInfo } from "node-fetch" export type ReturnType = T | Promise export type NullOr = T | null export type CallbackType = { parsedAPIResponse: ParsedAPIResponse apiResponse: Response } type UrlOrFullRequest = string | ({ url: string } & RequestInit) /** * * @param {string} url * @param {Promise | any} callback - Can be used for data */ function easyFetch( url: UrlOrFullRequest ): NullOr> function easyFetch( url: UrlOrFullRequest, callback: ({ parsedAPIResponse, apiResponse }: CallbackType) => ReturnType ): NullOr> async function easyFetch( url: UrlOrFullRequest, callback?: ({}: CallbackType) => ReturnType< CallbackResponse > ) { try { const apiResponse = await fetch( typeof url === "string" ? url : url.url, // @ts-ignore typeof url === "object" ? url : {} ) if (!apiResponse || apiResponse.status !== 200) return null if (callback) { const parsedAPIResponse = await apiResponse.json() return callback({ parsedAPIResponse, apiResponse }) as ReturnType< CallbackResponse > } return apiResponse } catch (error) { console.error("@raddo/EasyFetch:", error) return null } } export default easyFetch