UNPKG

@qrvey/fetch

Version:

![install size](https://packagephobia.now.sh/badge?p=%40qrvey%2Ffetch) ![coverage](https://img.shields.io/badge/unit_test_coverage-96%25-brightgreen)

1 lines 17.9 kB
{"version":3,"sources":["../../src/helpers/constants.ts","../../src/helpers/errors/customError.ts","../../src/helpers/errors/restClientError.ts","../../src/helpers/errors/restBadHttpActionParams.ts","../../src/services/fetchClient.service.ts","../../src/services/fetch.service.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export const DEFAULT_OPTIONS_WITH_API_KEY = {\n useApiKey: true,\n};\n\nexport const HTTPAction = {\n GET: 'GET',\n POST: 'POST',\n PATCH: 'PATCH',\n DELETE: 'DELETE',\n PUT: 'PUT',\n} as const;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nexport class CustomError extends Error {\n constructor(\n message: string,\n private errorDetails: any,\n stack?: string,\n private context = process.env.SERVICE_NAME || 'QrveyCustomError',\n ) {\n super(message);\n this.name = 'ERROR in ' + this.context;\n this.stack = stack;\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n stack: this.stack,\n details: this.errorDetails,\n };\n }\n}\n","import { CustomError } from './customError';\n\nexport class RestClientError extends CustomError {\n public details?: unknown;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(url: string, restError: any = {}) {\n const message = `REST Client Error at ${url}${\n restError?.message ? `: ${restError?.message}` : ''\n }`;\n super(message, restError, restError.stack);\n }\n}\n","import { CustomError } from './customError';\n\nexport class RestBadHttpActionParams extends CustomError {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(url: string, message: string, error: any = {}) {\n const errorMessage = `Bad RestHttpAction params at ${url}: ${message}`;\n super(errorMessage, error.message || error, error.stack);\n }\n}\n","import {\n IHttpActionOptions,\n IRequestHeaders,\n IFetchOptions,\n} from '../interfaces';\nimport { HttpMethod } from '../types';\nimport { RestBadHttpActionParams, RestClientError } from '../helpers/errors';\n\nexport default class FetchClientService {\n private static validateEndpoint(endpoint: string) {\n if (endpoint.startsWith('/')) return;\n const errorMessage = `Invalid endpoint \"${endpoint}\". Please replace with \"/${endpoint}\"`;\n throw new RestBadHttpActionParams(endpoint, errorMessage);\n }\n\n private static buildUrl(endpoint: string, options: IHttpActionOptions) {\n const baseDomain: string = process.env.DOMAIN ?? '';\n const privateDomain: string = process.env.PRIVATE_DOMAIN ?? '';\n const defaultDomain =\n options.privateDomain === false ? baseDomain : privateDomain;\n return `${options.baseDomain || defaultDomain}${endpoint}`;\n }\n\n private static baseHeaders(options: IHttpActionOptions) {\n const baseHeaders: IRequestHeaders = {\n 'Content-Type': 'application/json',\n };\n\n const customContentTypeHeader =\n options.headers?.['content-type'] ||\n options.headers?.['Content-Type'];\n\n if (customContentTypeHeader) {\n baseHeaders['Content-Type'] = customContentTypeHeader;\n }\n\n if (options.useApiKey && process.env.API_KEY)\n baseHeaders['x-api-key'] = process.env.API_KEY;\n return baseHeaders;\n }\n\n private static customHeaders(options: IHttpActionOptions) {\n const {\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n 'Content-Type': _ContentType,\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n 'content-type': _contentType,\n ...customHeadersObject\n } = options.headers || {};\n\n return customHeadersObject;\n }\n\n private static buildFetchOptions(\n method: string,\n body: unknown,\n options: IHttpActionOptions,\n ): IFetchOptions {\n const headers = {\n ...this.baseHeaders(options),\n ...this.customHeaders(options),\n };\n\n /**\n * * exclude headers with invalid values\n */\n const filteredHeaders = Object.fromEntries(\n Object.entries(headers).filter(\n ([, value]) => value !== null && value !== undefined,\n ),\n );\n\n const requestOptions: IFetchOptions = {\n headers: filteredHeaders,\n method,\n };\n if (body) requestOptions['body'] = JSON.stringify(body);\n return requestOptions;\n }\n\n private static isValidUrl(url: URL) {\n return !!(url.protocol && url.hostname && url.pathname);\n }\n\n private static hasValidProtocol(url: URL) {\n const secureProtocols = ['http:', 'https:'];\n return secureProtocols.includes(url.protocol);\n }\n\n private static verifyUrl(urlObj: URL): void {\n if (!this.isValidUrl(urlObj)) {\n throw new RestBadHttpActionParams(\n 'Invalid URL',\n `URL details: Protocol: ${urlObj.protocol}, Hostname: ${urlObj.hostname}, Pathname: ${urlObj.pathname}`,\n );\n }\n if (!this.hasValidProtocol(urlObj)) {\n throw new RestBadHttpActionParams(\n 'Invalid URL',\n `URL protocol [${urlObj.protocol}] is not secure`,\n );\n }\n }\n\n private static toHttpUrl(url: string) {\n try {\n const urlObj = new URL(url);\n this.verifyUrl(urlObj);\n return urlObj.href;\n } catch (error) {\n throw new RestBadHttpActionParams(\n `Invalid URL [${url}]`,\n 'URL is not valid.',\n error,\n );\n }\n }\n\n private static async getResponseData(\n isJsonResponse: boolean,\n response: Response,\n ) {\n const clonedResponse = response.clone();\n let responseData = null;\n try {\n if (isJsonResponse) {\n responseData = await response.json();\n } else {\n responseData = await response.text();\n }\n await clonedResponse.text();\n } catch (_) {\n responseData = await clonedResponse.text();\n }\n return responseData;\n }\n\n private static async handleResponse(response: Response): Promise<unknown> {\n const responseContentType = response.headers.get('content-type');\n const isJsonResponse =\n responseContentType &&\n responseContentType.includes('application/json');\n\n const responseData = await this.getResponseData(\n !!isJsonResponse,\n response,\n );\n\n if (response.ok) {\n return responseData;\n }\n throw new RestClientError(response.url, responseData);\n }\n\n private static fetchData(url: string, requestOptions: IFetchOptions) {\n return fetch(url, requestOptions)\n .then(this.handleResponse.bind(this))\n .catch((error) => {\n if (error instanceof RestClientError) throw error;\n throw new RestClientError(url, error);\n });\n }\n\n private static queryParamsToQueryString(\n queryParameters: Record<string, string | string[]>,\n ) {\n const queryParamsArray = Object.entries(queryParameters).map(\n ([queryName, queryValue]) => {\n const isArrayValue = Array.isArray(queryValue);\n if (isArrayValue)\n return queryValue\n .map((val) => `${queryName}=${val}`)\n .join('&');\n else return `${queryName}=${queryValue}`;\n },\n );\n return queryParamsArray.join('&');\n }\n\n public static httpAction(\n method: HttpMethod,\n endpoint: string,\n body: unknown,\n options: IHttpActionOptions = {},\n ) {\n this.validateEndpoint(endpoint);\n const url = this.buildUrl(endpoint, options);\n const queryParamsString = options.queryParameters\n ? `?${this.queryParamsToQueryString(options.queryParameters)}`\n : '';\n const httpUrl = this.toHttpUrl(`${url}${queryParamsString}`);\n return this.fetchData(\n httpUrl,\n this.buildFetchOptions(method.toUpperCase(), body, options),\n );\n }\n}\n","import { HTTPAction } from '../helpers/constants';\nimport { IFetchOptions, IHttpActionOptions } from '../interfaces';\nimport { HttpMethod } from '../types';\nimport FetchClientService from './fetchClient.service';\n\nexport default class FetchService {\n static sendRequest(\n endpoint: string,\n body: unknown,\n options: IFetchOptions,\n ) {\n return FetchClientService.httpAction(\n options.method as HttpMethod,\n endpoint,\n body,\n options,\n );\n }\n\n static get(endpoint: string, options: IHttpActionOptions) {\n return FetchService.sendRequest(endpoint, null, {\n ...options,\n method: HTTPAction.GET,\n });\n }\n\n static post(endpoint: string, body: unknown, options: IHttpActionOptions) {\n return FetchService.sendRequest(endpoint, body, {\n ...options,\n method: HTTPAction.POST,\n });\n }\n\n static put(endpoint: string, body: unknown, options: IHttpActionOptions) {\n return FetchService.sendRequest(endpoint, body, {\n ...options,\n method: HTTPAction.PUT,\n });\n }\n\n static patch(endpoint: string, body: unknown, options: IHttpActionOptions) {\n return FetchService.sendRequest(endpoint, body, {\n ...options,\n method: HTTPAction.PATCH,\n });\n }\n\n static delete(\n endpoint: string,\n body: unknown,\n options: IHttpActionOptions,\n ) {\n return FetchService.sendRequest(endpoint, body, {\n ...options,\n method: HTTPAction.DELETE,\n });\n }\n}\n"]}