@remcostoeten/fync
Version:
Unified TypeScript library for 9 popular APIs with consistent functional architecture
115 lines (114 loc) • 2.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createFyncApi = createFyncApi;
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();
}
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
};
}