@rzl-zone/utils-js
Version:
A modern, lightweight set of JavaScript utility functions with TypeScript support for everyday development, crafted to enhance code readability and maintainability.
102 lines (96 loc) • 3.54 kB
JavaScript
/*!
* ====================================================
* Rzl Utils-JS.
* ----------------------------------------------------
* Version: 3.11.0.
* Author: Rizalvin Dwiky.
* Repository: https://github.com/rzl-zone/utils-js.
* ====================================================
*/
import { isDate, isMap } from './chunk-AXDYWO67.js';
import { isObjectOrArray, isError, isSet, isArray, isUndefined } from './chunk-MSUW5VHZ.js';
var isRegExp = (value) => {
return value instanceof RegExp;
};
function isArrayBuffer(value) {
return value instanceof ArrayBuffer;
}
function baseDeepEqual(value, other, customizer, seen = /* @__PURE__ */ new WeakMap()) {
if (value === other) return true;
if (value !== value && other !== other) return true;
if (!isObjectOrArray(value) || !isObjectOrArray(other)) {
return false;
}
if (seen.get(value) === other) return true;
seen.set(value, other);
const callCustomizer = (v, o, key, valObj, othObj) => {
if (customizer) {
const result = customizer(v, o, key, valObj, othObj, seen);
if (!isUndefined(result)) return result;
}
return baseDeepEqual(v, o, customizer, seen);
};
if (isDate(value) && isDate(other)) return value.getTime() === other.getTime();
if (isRegExp(value) && isRegExp(other))
return value.source === other.source && value.flags === other.flags;
if (isError(value) && isError(other))
return value.name === other.name && value.message === other.message;
if (ArrayBuffer.isView(value) && ArrayBuffer.isView(other)) {
const v = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
const o = new Uint8Array(other.buffer, other.byteOffset, other.byteLength);
if (v.length !== o.length) return false;
for (let i = 0; i < v.length; i++) if (v[i] !== o[i]) return false;
return true;
}
if (isArrayBuffer(value) && isArrayBuffer(other)) {
if (value.byteLength !== other.byteLength) return false;
const v = new Uint8Array(value), o = new Uint8Array(other);
for (let i = 0; i < v.length; i++) if (v[i] !== o[i]) return false;
return true;
}
if (isMap(value) && isMap(other)) {
if (value.size !== other.size) return false;
for (const [k, v] of value) {
if (!other.has(k)) return false;
if (!baseDeepEqual(v, other.get(k), customizer, seen)) return false;
}
return true;
}
if (isSet(value) && isSet(other)) {
if (value.size !== other.size) return false;
for (const v of value) {
let matched = false;
for (const o of other) {
if (baseDeepEqual(v, o, customizer, seen)) {
matched = true;
break;
}
}
if (!matched) return false;
}
return true;
}
if (isArray(value) && isArray(other)) {
if (value.length !== other.length) return false;
for (let i = 0; i < value.length; i++) {
if (!callCustomizer(value[i], other[i], i, value, other)) return false;
}
return true;
}
if (Object.getPrototypeOf(value) !== Object.getPrototypeOf(other)) {
return false;
}
const vKeys = Reflect.ownKeys(value);
const oKeys = Reflect.ownKeys(other);
if (vKeys.length !== oKeys.length) return false;
for (const key of vKeys) {
const vVal = value[key];
const oVal = other[key];
if (!callCustomizer(vVal, oVal, key, value, other)) return false;
}
return true;
}
function isEqual(value, other) {
return baseDeepEqual(value, other, void 0, /* @__PURE__ */ new WeakMap());
}
export { baseDeepEqual, isArrayBuffer, isEqual, isRegExp };