UNPKG

@remcostoeten/fync

Version:

Unified TypeScript library for 9 popular APIs with consistent functional architecture

115 lines (114 loc) 2.74 kB
"use strict"; 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 }; }