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
JavaScript
"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;