@beenotung/tslib
Version:
utils library in Typescript
64 lines (63 loc) • 2.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.jsonToFormData = jsonToFormData;
exports.postMultipartFormData = postMultipartFormData;
const response_1 = require("./response");
/**
* @description also support files in { [field: string]: File[] | File }
* One use-case is for FileFieldsInterceptor in nest-client
*/
function jsonToFormData(json, formData = new FormData()) {
Object.keys(json).forEach(key => {
const value = json[key];
switch (typeof value) {
case 'string':
case 'number':
case 'boolean':
formData.append(key, value.toString());
break;
default:
if (isFile(value)) {
formData.append(key, value);
}
else if (Array.isArray(value)) {
value.forEach(value => formData.append(key, value));
}
else if (value) {
let hasFile = false;
for (const [key, val] of Object.entries(value)) {
if (isFile(val)) {
hasFile = true;
formData.append(key, val);
}
else if (Array.isArray(val)) {
for (const v of val) {
if (isFile(v)) {
hasFile = true;
formData.append(key, v);
}
}
}
}
if (!hasFile) {
formData.append(key, JSON.stringify(value));
}
}
}
});
return formData;
}
function isFile(value) {
return typeof File !== 'undefined' && value instanceof File;
}
function postMultipartFormData(url, json) {
const formData = new FormData();
jsonToFormData(json, formData);
return fetch(url, { method: 'POST', body: formData }).then(res => (0, response_1.decodeResponse)(res).then((data) => {
return {
status: res.status,
statusText: res.statusText,
data: data,
};
}));
}