You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.4 KiB
90 lines
2.4 KiB
const isUndefined = (value) => value === undefined;
|
|
|
|
const isNull = (value) => value === null;
|
|
|
|
const isBoolean = (value) => typeof value === 'boolean';
|
|
|
|
const isObject = (value) => value === Object(value);
|
|
|
|
const isArray = (value) => Array.isArray(value);
|
|
|
|
const isDate = (value) => value instanceof Date;
|
|
|
|
const isBlob = (value) =>
|
|
value &&
|
|
typeof value.size === 'number' &&
|
|
typeof value.type === 'string' &&
|
|
typeof value.slice === 'function';
|
|
|
|
const isFile = (value) =>
|
|
isBlob(value) &&
|
|
typeof value.name === 'string' &&
|
|
(typeof value.lastModifiedDate === 'object' ||
|
|
typeof value.lastModified === 'number');
|
|
|
|
const objectToFormData = (obj, cfg, fd, pre) => {
|
|
cfg = cfg || {};
|
|
|
|
cfg.indices = isUndefined(cfg.indices) ? true : cfg.indices;
|
|
|
|
cfg.nullsAsUndefineds = isUndefined(cfg.nullsAsUndefineds)
|
|
? false
|
|
: cfg.nullsAsUndefineds;
|
|
|
|
cfg.booleansAsIntegers = isUndefined(cfg.booleansAsIntegers)
|
|
? false
|
|
: cfg.booleansAsIntegers;
|
|
|
|
cfg.allowEmptyArrays = isUndefined(cfg.allowEmptyArrays)
|
|
? true
|
|
: cfg.allowEmptyArrays;
|
|
|
|
fd = fd || new FormData();
|
|
|
|
if (isUndefined(obj)) {
|
|
return fd;
|
|
} else if (isNull(obj)) {
|
|
if (!cfg.nullsAsUndefineds) {
|
|
fd.append(pre, '');
|
|
}
|
|
} else if (isBoolean(obj)) {
|
|
if (cfg.booleansAsIntegers) {
|
|
fd.append(pre, obj ? 1 : 0);
|
|
} else {
|
|
fd.append(pre, obj);
|
|
}
|
|
} else if (isArray(obj)) {
|
|
if (obj.length) {
|
|
obj.forEach((value, index) => {
|
|
const key = pre + '[' + (cfg.indices ? index : '') + ']';
|
|
|
|
objectToFormData(value, cfg, fd, key);
|
|
});
|
|
} else if (cfg.allowEmptyArrays) {
|
|
fd.append(pre , []);
|
|
}
|
|
} else if (isDate(obj)) {
|
|
fd.append(pre, obj.toISOString());
|
|
} else if (isObject(obj) && !isFile(obj) && !isBlob(obj)) {
|
|
Object.keys(obj).forEach((prop) => {
|
|
const value = obj[prop];
|
|
|
|
if (isArray(value)) {
|
|
while (prop.length > 2 && prop.lastIndexOf('[]') === prop.length - 2) {
|
|
prop = prop.substring(0, prop.length - 2);
|
|
}
|
|
}
|
|
|
|
const key = pre ? pre + '[' + prop + ']' : prop;
|
|
|
|
objectToFormData(value, cfg, fd, key);
|
|
});
|
|
} else {
|
|
fd.append(pre, obj);
|
|
}
|
|
|
|
return fd;
|
|
};
|
|
|
|
export { objectToFormData };
|