UNPKG

@beenotung/tslib

Version:
64 lines (63 loc) 2.29 kB
"use strict"; 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, }; })); }