@goatlab/fluent
Version:
Readable query Interface & API generator for TS and Node
70 lines • 2.01 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.clearEmpties = void 0;
const bson_1 = require("bson");
/**
* Deeply removes all empty and nullish values from a
* given object
* @param object
* @returns
*/
const clearEmpties = (object) => {
if (Array.isArray(object)) {
return clearEmptiesFromArray(object);
}
if (typeof object === 'object' && object !== null) {
return clearEmptiesFromObject(object);
}
return object;
};
exports.clearEmpties = clearEmpties;
function isEmptyValue(value) {
return (value === null ||
value === undefined ||
(Array.isArray(value) && value.length === 0));
}
function isProcessableObject(value) {
return (value &&
typeof value === 'object' &&
!(value instanceof Date) &&
!(value instanceof bson_1.ObjectId));
}
function clearEmptiesFromArray(arr) {
// Process arrays backwards to handle splicing correctly
for (let i = arr.length - 1; i >= 0; i--) {
const value = arr[i];
if (isProcessableObject(value)) {
(0, exports.clearEmpties)(value);
if (Array.isArray(value)
? value.length === 0
: Object.keys(value).length === 0) {
arr.splice(i, 1);
}
}
else if (isEmptyValue(value)) {
arr.splice(i, 1);
}
}
return arr;
}
function clearEmptiesFromObject(obj) {
for (const key in obj) {
if (!Object.hasOwn(obj, key)) {
continue;
}
const value = obj[key];
if (isEmptyValue(value)) {
delete obj[key];
}
else if (isProcessableObject(value)) {
(0, exports.clearEmpties)(value);
if (Array.isArray(value)
? value.length === 0
: Object.keys(value).length === 0) {
delete obj[key];
}
}
}
return obj;
}
//# sourceMappingURL=clearEmpties.js.map