UNPKG

@remcostoeten/fync

Version:

A unified TypeScript library for easy access to popular APIs (GitHub, Spotify, GitLab, etc.)

81 lines 2.75 kB
import { fetch } from "undici"; function createHttpClient(config = {}) { const { baseUrl = "https://registry.npmjs.org", defaultHeaders = {}, timeout = 30000, } = config; async function request(endpoint, options = {}) { const { method = "GET", params, headers = {} } = options; let url = endpoint.startsWith("http") ? endpoint : `${baseUrl}${endpoint}`; if (params) { const searchParams = new URLSearchParams(); for (const [key, value] of Object.entries(params)) { searchParams.append(key, String(value)); } if (searchParams.toString()) { url += `?${searchParams.toString()}`; } } const requestHeaders = { Accept: "application/json", "User-Agent": "npm-http-client", ...defaultHeaders, ...headers, }; try { const response = await fetch(url, { method, headers: requestHeaders, signal: AbortSignal.timeout(timeout), }); const responseHeaders = {}; response.headers.forEach(function setResponseHeader(value, key) { responseHeaders[key] = value; }); if (!response.ok) { throw new Error(`HTTP ${response.status}: ${response.statusText} for ${url}`); } const contentType = response.headers.get("content-type") || ""; let data; if (contentType.includes("application/json")) { data = (await response.json()); } else { data = (await response.text()); } return { data, status: response.status, headers: responseHeaders, }; } catch (error) { if (error instanceof Error) { throw new Error(`NPM API request failed: ${error.message}`); } throw error; } } function get(endpoint, params) { return request(endpoint, { method: "GET", params }); } function post(endpoint, data) { return request(endpoint, { method: "POST" }); } function put(endpoint, data) { return request(endpoint, { method: "PUT" }); } function patch(endpoint, data) { return request(endpoint, { method: "PATCH" }); } function deleteMethod(endpoint, data) { return request(endpoint, { method: "DELETE" }); } return { get, post, put, patch, delete: deleteMethod, request, }; } export { createHttpClient }; //# sourceMappingURL=http-client.js.map