omit-empty-es
Version:
(fork of omit-empty) Recursively omit empty properties from an object. Omits empty objects, arrays, strings or zero.
282 lines (257 loc) • 8.57 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var _createForOfIteratorHelper = require('@babel/runtime/helpers/createForOfIteratorHelper');
var _Array$isArray = require('@babel/runtime-corejs3/core-js-stable/array/is-array');
var _filterInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/filter');
var _mapInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/map');
var _Object$keys2 = require('@babel/runtime-corejs3/core-js-stable/object/keys');
var _typeof = require('@babel/runtime-corejs3/helpers/typeof');
var _sliceInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/slice');
var _flagsInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/flags');
var _indexOfInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/index-of');
function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
var _Array$isArray__default = /*#__PURE__*/_interopDefault(_Array$isArray);
var _filterInstanceProperty__default = /*#__PURE__*/_interopDefault(_filterInstanceProperty);
var _mapInstanceProperty__default = /*#__PURE__*/_interopDefault(_mapInstanceProperty);
var _Object$keys2__default = /*#__PURE__*/_interopDefault(_Object$keys2);
var _sliceInstanceProperty__default = /*#__PURE__*/_interopDefault(_sliceInstanceProperty);
var _flagsInstanceProperty__default = /*#__PURE__*/_interopDefault(_flagsInstanceProperty);
var _indexOfInstanceProperty__default = /*#__PURE__*/_interopDefault(_indexOfInstanceProperty);
var toString = Object.prototype.toString;
function kindOf(val) {
if (val === void 0) return 'undefined';
if (val === null) return 'null';
var type = _typeof(val);
if (type === 'boolean') return 'boolean';
if (type === 'string') return 'string';
if (type === 'number') return 'number';
if (type === 'symbol') return 'symbol';
if (type === 'function') {
return isGeneratorFn(val) ? 'generatorfunction' : 'function';
}
if (isArray(val)) return 'array';
if (isBuffer(val)) return 'buffer';
if (isArguments(val)) return 'arguments';
if (isDate(val)) return 'date';
if (isError(val)) return 'error';
if (isRegexp(val)) return 'regexp';
switch (ctorName(val)) {
case 'Symbol':
return 'symbol';
case 'Promise':
return 'promise';
// Set, Map, WeakSet, WeakMap
case 'WeakMap':
return 'weakmap';
case 'WeakSet':
return 'weakset';
case 'Map':
return 'map';
case 'Set':
return 'set';
// 8-bit typed arrays
case 'Int8Array':
return 'int8array';
case 'Uint8Array':
return 'uint8array';
case 'Uint8ClampedArray':
return 'uint8clampedarray';
// 16-bit typed arrays
case 'Int16Array':
return 'int16array';
case 'Uint16Array':
return 'uint16array';
// 32-bit typed arrays
case 'Int32Array':
return 'int32array';
case 'Uint32Array':
return 'uint32array';
case 'Float32Array':
return 'float32array';
case 'Float64Array':
return 'float64array';
}
if (isGeneratorObj(val)) {
return 'generator';
}
// Non-plain objects
// @ts-expect-error
type = toString.call(val);
switch (type) {
// @ts-expect-error
case '[object Object]':
return 'object';
// iterators
// @ts-expect-error
case '[object Map Iterator]':
return 'mapiterator';
// @ts-expect-error
case '[object Set Iterator]':
return 'setiterator';
// @ts-expect-error
case '[object String Iterator]':
return 'stringiterator';
// @ts-expect-error
case '[object Array Iterator]':
return 'arrayiterator';
}
// other
return _sliceInstanceProperty__default["default"](type).call(type, 8, -1).toLowerCase().replace(/\s/g, '');
}
// @ts-expect-error
function ctorName(val) {
return val.constructor ? val.constructor.name : null;
}
// @ts-expect-error
function isArray(val) {
if (_Array$isArray__default["default"]) return _Array$isArray__default["default"](val);
return val instanceof Array;
}
// @ts-expect-error
function isError(val) {
return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number';
}
// @ts-expect-error
function isDate(val) {
if (val instanceof Date) return true;
return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function';
}
// @ts-expect-error
function isRegexp(val) {
if (val instanceof RegExp) return true;
return typeof _flagsInstanceProperty__default["default"](val) === 'string' && typeof val.ignoreCase === 'boolean' && typeof val.multiline === 'boolean' && typeof val.global === 'boolean';
}
// @ts-expect-error
function isGeneratorFn(name) {
return ctorName(name) === 'GeneratorFunction';
}
// @ts-expect-error
function isGeneratorObj(val) {
return typeof val.throw === 'function' && typeof val.return === 'function' && typeof val.next === 'function';
}
// @ts-expect-error
function isArguments(val) {
try {
if (typeof val.length === 'number' && typeof val.callee === 'function') {
return true;
}
} catch (err) {
var _context;
if (err instanceof Error && _indexOfInstanceProperty__default["default"](_context = err.message).call(_context, 'callee') !== -1) {
return true;
}
}
return false;
}
/**
* If you need to support Safari 5-7 (8-10 yr-old browser),
* take a look at https://github.com/feross/is-buffer
*/
// @ts-expect-error
function isBuffer(val) {
if (val.constructor && typeof val.constructor.isBuffer === 'function') {
return val.constructor.isBuffer(val);
}
return false;
}
var omitEmpty = function omitEmpty(obj, options) {
var omitZero = options ? options.omitZero : false;
/* eslint-disable no-param-reassign */
var omit = function omit(value) {
if (_Array$isArray__default["default"](value)) {
var _context;
// @ts-expect-error
value = _filterInstanceProperty__default["default"](_context = _mapInstanceProperty__default["default"](value).call(value, function (v) {
return omit(v);
})).call(_context, function (v) {
return !isEmpty(v, omitZero);
});
}
if (kindOf(value) === 'object') {
var result = {};
// eslint-disable-next-line no-restricted-syntax
// @ts-expect-error
for (var _i = 0, _Object$keys = _Object$keys2__default["default"](value); _i < _Object$keys.length; _i++) {
var key = _Object$keys[_i];
// @ts-expect-error
var val = omit(value[key]);
if (val !== void 0) {
// @ts-expect-error
result[key] = val;
}
}
// @ts-expect-error
value = result;
}
if (!isEmpty(value, omitZero)) {
return value;
}
return void 0;
};
/* eslint-enable no-param-reassign */
var res = omit(obj);
if (res === void 0) {
res = kindOf(obj) === 'object' ? {} : res;
}
return res;
};
function isEmpty(value, omitZero) {
switch (kindOf(value)) {
case 'null':
case 'undefined':
return true;
case 'boolean':
case 'function':
case 'date':
case 'regexp':
return false;
case 'string':
case 'arguments':
// @ts-expect-error
return value.length === 0;
case 'file':
case 'map':
case 'set':
// @ts-expect-error
return value.size === 0;
case 'number':
return omitZero ? value === 0 : false;
case 'error':
// @ts-expect-error
return value.message === '';
case 'array':
// eslint-disable-next-line no-restricted-syntax
// @ts-expect-error
var _iterator = _createForOfIteratorHelper(value),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var ele = _step.value;
if (!isEmpty(ele, omitZero)) {
return false;
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return true;
case 'object':
// eslint-disable-next-line no-restricted-syntax
// @ts-expect-error
for (var _i2 = 0, _Object$keys3 = _Object$keys2__default["default"](value); _i2 < _Object$keys3.length; _i2++) {
var key = _Object$keys3[_i2];
// @ts-expect-error
if (!isEmpty(value[key], omitZero)) {
return false;
}
}
return true;
default:
{
return true;
}
}
}
exports["default"] = omitEmpty;