UNPKG

simple-fetch-ts

Version:

`simple-fetch-ts` is a TypeScript library designed to simplify HTTP requests using a builder-pattern approach. It provides a fluent API for creating, configuring, and executing various HTTP methods (`GET`, `POST`, `PUT`, `PATCH`, `DELETE`) with type safet

106 lines (105 loc) 4.16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SimpleBuilder = void 0; const request_body_error_1 = require("../errors/request-body-error"); const delete_1 = require("../methods/delete"); const fetch_1 = require("../methods/fetch"); const patch_1 = require("../methods/patch"); const post_1 = require("../methods/post"); const put_1 = require("../methods/put"); const url_helpers_1 = require("../utility/url-helpers"); class SimpleBuilder { constructor(url, defaultHeaders = {}, useAbortController = true) { this.requestBody = null; this.requestHeaders = {}; this.requestParams = ""; this.useAbortController = true; this.url = url; this.requestHeaders = defaultHeaders; this.useAbortController = useAbortController; } abortController(controller) { this.privateAbortController = controller; return this; } body(body) { this.requestBody = body; return this; } headers(requestHeaders) { this.requestHeaders = { ...this.requestHeaders, ...requestHeaders }; return this; } params(requestParams, lowerCaseKeys = false) { this.requestParams = (0, url_helpers_1.serializeQueryParams)(requestParams, lowerCaseKeys); return this; } buildUrl() { return this.requestParams ? `${this.url}?${this.requestParams}` : this.url; } isHeadersRecord(headers) { return typeof headers === "object" && !(headers instanceof Headers); } prepareHeaders() { if (this.isHeadersRecord(this.requestHeaders) && !this.requestHeaders["Content-Type"] && this.requestBody) { this.requestHeaders["Content-Type"] = "application/json"; } } async handleRequest(requestFn, method) { if (!["POST", "PUT", "PATCH", "DELETE"].includes(method) && this.requestBody !== null) { throw new request_body_error_1.InvalidMethodBodyError(method, this.url); } this.prepareHeaders(); try { return await requestFn(); } catch (error) { console.error(`Error with ${method} request to ${this.url}:`, error); throw error; } } async fetch() { const signal = this.privateAbortController ? this.privateAbortController.signal : this.useAbortController ? new AbortController().signal : undefined; return this.handleRequest(() => (0, fetch_1.tsFetch)(this.buildUrl(), this.requestHeaders, signal), "GET"); } async post() { const signal = this.privateAbortController ? this.privateAbortController.signal : this.useAbortController ? new AbortController().signal : undefined; return this.handleRequest(() => (0, post_1.tsPost)(this.buildUrl(), this.requestBody, this.requestHeaders, signal), "POST"); } async put() { const signal = this.privateAbortController ? this.privateAbortController.signal : this.useAbortController ? new AbortController().signal : undefined; return this.handleRequest(() => (0, put_1.tsPut)(this.buildUrl(), this.requestBody, this.requestHeaders, signal), "PUT"); } async patch() { const signal = this.privateAbortController ? this.privateAbortController.signal : this.useAbortController ? new AbortController().signal : undefined; return this.handleRequest(() => (0, patch_1.tsPatch)(this.buildUrl(), this.requestBody, this.requestHeaders, signal), "PATCH"); } async delete() { const signal = this.privateAbortController ? this.privateAbortController.signal : this.useAbortController ? new AbortController().signal : undefined; return this.handleRequest(() => (0, delete_1.tsDelete)(this.buildUrl(), this.requestHeaders, signal), "DELETE"); } } exports.SimpleBuilder = SimpleBuilder;