@remcostoeten/fync
Version:
Unified TypeScript library for 9 popular APIs with consistent functional architecture
88 lines • 2.84 kB
JavaScript
function buildAuthHeaders(auth) {
if (!auth)
return {};
switch (auth.type) {
case "bearer":
return { Authorization: `Bearer ${auth.token}` };
case "basic": {
const { username = "", password = "" } = auth.credentials || {};
const encoded = Buffer.from(`${username}:${password}`).toString("base64");
return { Authorization: `Basic ${encoded}` };
}
case "apikey":
return { "X-API-Key": auth.key || "" };
case "oauth2":
return { Authorization: `Bearer ${auth.token}` };
default:
return {};
}
}
function buildUrl(baseUrl, path, params) {
const url = new URL(path, baseUrl);
if (params) {
Object.entries(params).forEach(function ([key, value]) {
if (value !== undefined && value !== null) {
url.searchParams.append(key, String(value));
}
});
}
return url.toString();
}
export function createFyncApi(config) {
const authHeaders = buildAuthHeaders(config.auth);
const defaultHeaders = {
"Content-Type": "application/json",
...config.headers,
...authHeaders,
};
async function request(method, path, options) {
const url = buildUrl(config.baseUrl, path, options?.params);
const headers = { ...defaultHeaders, ...options?.headers };
const fetchOptions = {
method,
headers,
};
if (options?.body && method !== "GET") {
fetchOptions.body = JSON.stringify(options.body);
}
try {
const response = await fetch(url, fetchOptions);
if (!response.ok) {
const errorText = await response.text();
throw new Error(`API request failed: ${response.status} ${response.statusText} - ${errorText}`);
}
const data = await response.json();
return data;
}
catch (error) {
if (error instanceof Error) {
throw error;
}
throw new Error(`API request failed: ${String(error)}`);
}
}
function get(path, options) {
return request("GET", path, options);
}
function post(path, body, options) {
return request("POST", path, { ...options, body });
}
function put(path, body, options) {
return request("PUT", path, { ...options, body });
}
function deleteRequest(path, options) {
return request("DELETE", path, options);
}
function patch(path, body, options) {
return request("PATCH", path, { ...options, body });
}
return {
request,
get,
post,
put,
delete: deleteRequest,
patch,
};
}
//# sourceMappingURL=api-factory.js.map