@remcostoeten/fync
Version:
A unified TypeScript library for easy access to popular APIs (GitHub, Spotify, GitLab, etc.)
102 lines (101 loc) • 2.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createHttpClient = createHttpClient;
var _undici = require("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 (0, _undici.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
};
}