@remcostoeten/fync
Version:
A unified TypeScript library for easy access to popular APIs (GitHub, Spotify, GitLab, etc.)
81 lines • 2.75 kB
JavaScript
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