@trayio/axios
Advanced tools
Comparing version 1.8.0 to 1.9.0
import * as TE from 'fp-ts/TaskEither'; | ||
import { HttpClient } from '@trayio/commons/http/HttpClient'; | ||
import { HttpMethod, HttpRequest, HttpResponse } from '@trayio/commons/http/Http'; | ||
import FormData = require('form-data'); | ||
import { FileStorage } from '@trayio/commons/file/File'; | ||
export declare class AxiosHttpClient implements HttpClient { | ||
private readonly fileStorage; | ||
constructor(fileStorage: FileStorage); | ||
execute(method: HttpMethod, url: string, request: HttpRequest): TE.TaskEither<Error, HttpResponse>; | ||
private axiosErrorToHttpResponse; | ||
private axiosResponseToHttpResponse; | ||
appendFields: (formData: FormData) => (fields: Record<string, string>) => FormData; | ||
} | ||
//# sourceMappingURL=AxiosHttpClient.d.ts.map |
"use strict"; | ||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
var desc = Object.getOwnPropertyDescriptor(m, k); | ||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
desc = { enumerable: true, get: function() { return m[k]; } }; | ||
} | ||
Object.defineProperty(o, k2, desc); | ||
}) : (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
o[k2] = m[k]; | ||
})); | ||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | ||
Object.defineProperty(o, "default", { enumerable: true, value: v }); | ||
}) : function(o, v) { | ||
o["default"] = v; | ||
}); | ||
var __importStar = (this && this.__importStar) || function (mod) { | ||
if (mod && mod.__esModule) return mod; | ||
var result = {}; | ||
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | ||
__setModuleDefault(result, mod); | ||
return result; | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
@@ -7,6 +30,30 @@ return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
exports.AxiosHttpClient = void 0; | ||
const TE = __importStar(require("fp-ts/TaskEither")); | ||
const function_1 = require("fp-ts/function"); | ||
const Http_1 = require("@trayio/commons/http/Http"); | ||
const Task_1 = require("@trayio/commons/task/Task"); | ||
const axios_1 = __importDefault(require("axios")); | ||
const FormData = require("form-data"); | ||
class AxiosHttpClient { | ||
constructor(fileStorage) { | ||
this.fileStorage = fileStorage; | ||
this.appendFields = (formData) => (fields) => { | ||
Object.entries(fields).forEach(([key, value]) => { | ||
formData.append(key, value); | ||
}); | ||
return formData; | ||
}; | ||
} | ||
execute(method, url, request) { | ||
/* | ||
Removes default headers so that we control what we send to the server, without this, it sends default content-type and accept headers, | ||
the caller of this HttpClient interface is responsible of deciding the values of these headers, axios shouldn't try to be smart | ||
and derive these from the body or even set defaults. | ||
*/ | ||
axios_1.default.defaults.headers.common = {}; | ||
axios_1.default.defaults.headers.get = {}; | ||
axios_1.default.defaults.headers.post = {}; | ||
axios_1.default.defaults.headers.put = {}; | ||
axios_1.default.defaults.headers.patch = {}; | ||
axios_1.default.defaults.headers.delete = {}; | ||
const finalUrl = Object.entries(request.pathParams).reduce((acc, [key, value]) => acc.replace(`:${key}`, encodeURIComponent(value)), url); | ||
@@ -17,3 +64,27 @@ const headers = Object.entries(request.headers).reduce((acc, [key, value]) => { | ||
}, {}); | ||
const axiosConfig = { | ||
let axiosConfig; | ||
if (headers['content-type'] && | ||
headers['content-type'].includes(Http_1.HttpContentType.MultipartRequestBody)) { | ||
const formData = new FormData(); | ||
this.appendFields(formData)(request.body.fields); | ||
const fileEntries = Object.entries(request.body.files); | ||
const taskEithers = fileEntries.map(([key, value]) => (0, function_1.pipe)(this.fileStorage.read(value.key), TE.map((file) => (Object.assign(Object.assign({}, file), { formFileName: key }))))); | ||
return (0, function_1.pipe)(TE.sequenceArray(taskEithers), TE.map((files) => files), TE.chain((files) => { | ||
files.forEach((file) => { | ||
formData.append(file.formFileName, file.content, file.metadata.key); | ||
}); | ||
axiosConfig = { | ||
url: finalUrl, | ||
method: method.toString(), | ||
data: formData, | ||
responseType: 'arraybuffer', | ||
headers, | ||
params: request.queryString, | ||
}; | ||
return (0, Task_1.createTaskEitherFromPromiseWithSimpleError)(() => (0, axios_1.default)(axiosConfig) | ||
.then(this.axiosResponseToHttpResponse) | ||
.catch(this.axiosErrorToHttpResponse.bind(this))); | ||
})); | ||
} | ||
axiosConfig = { | ||
url: finalUrl, | ||
@@ -26,13 +97,2 @@ method: method.toString(), | ||
}; | ||
/* | ||
Removes default headers so that we control what we send to the server, without this, it sends default content-type and accept headers, | ||
the caller of this HttpClient interface is responsible of deciding the values of these headers, axios shouldn't try to be smart | ||
and derive these from the body or even set defaults. | ||
*/ | ||
axios_1.default.defaults.headers.common = {}; | ||
axios_1.default.defaults.headers.get = {}; | ||
axios_1.default.defaults.headers.post = {}; | ||
axios_1.default.defaults.headers.put = {}; | ||
axios_1.default.defaults.headers.patch = {}; | ||
axios_1.default.defaults.headers.delete = {}; | ||
return (0, Task_1.createTaskEitherFromPromiseWithSimpleError)(() => (0, axios_1.default)(axiosConfig) | ||
@@ -39,0 +99,0 @@ .then(this.axiosResponseToHttpResponse) |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const NodeFsFileStorage_1 = require("@trayio/commons/file/NodeFsFileStorage"); | ||
const HttpClient_abstract_test_1 = require("@trayio/commons/http/HttpClient.abstract.test"); | ||
const AxiosHttpClient_1 = require("./AxiosHttpClient"); | ||
(0, HttpClient_abstract_test_1.httpClientTest)(new AxiosHttpClient_1.AxiosHttpClient()); | ||
(0, HttpClient_abstract_test_1.httpClientTest)(new AxiosHttpClient_1.AxiosHttpClient(new NodeFsFileStorage_1.NodeFsFileStorage())); |
{ | ||
"name": "@trayio/axios", | ||
"version": "1.8.0", | ||
"version": "1.9.0", | ||
"description": "Axios extensions and implementations", | ||
@@ -17,4 +17,5 @@ "exports": { | ||
"dependencies": { | ||
"@trayio/commons": "1.8.0", | ||
"axios": "0.27.2" | ||
"@trayio/commons": "1.9.0", | ||
"axios": "0.27.2", | ||
"form-data": "4.0.0" | ||
}, | ||
@@ -21,0 +22,0 @@ "typesVersions": { |
Sorry, the diff of this file is not supported yet
9060
137
3
+ Addedform-data@4.0.0
+ Added@trayio/commons@1.9.0(transitive)
+ Added@types/formidable@3.4.4(transitive)
+ Addedasap@2.0.6(transitive)
+ Addeddezalgo@1.0.4(transitive)
+ Addedform-data@4.0.0(transitive)
+ Addedformidable@3.5.2(transitive)
+ Addedhexoid@2.0.0(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedwrappy@1.0.2(transitive)
- Removed@trayio/commons@1.8.0(transitive)
- Removedcall-bind-apply-helpers@1.0.2(transitive)
- Removeddunder-proto@1.0.1(transitive)
- Removedes-define-property@1.0.1(transitive)
- Removedes-errors@1.3.0(transitive)
- Removedes-object-atoms@1.1.1(transitive)
- Removedes-set-tostringtag@2.1.0(transitive)
- Removedform-data@4.0.2(transitive)
- Removedfunction-bind@1.1.2(transitive)
- Removedget-intrinsic@1.3.0(transitive)
- Removedget-proto@1.0.1(transitive)
- Removedgopd@1.2.0(transitive)
- Removedhas-symbols@1.1.0(transitive)
- Removedhas-tostringtag@1.0.2(transitive)
- Removedhasown@2.0.2(transitive)
- Removedmath-intrinsics@1.1.0(transitive)
Updated@trayio/commons@1.9.0