@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.
110 lines (105 loc) • 3.72 kB
JavaScript
/*!
* ====================================================
* Rzl Utils-JS.
* ----------------------------------------------------
* Version: 3.11.0.
* Author: Rizalvin Dwiky.
* Repository: https://github.com/rzl-zone/utils-js.
* ====================================================
*/
import { safeJsonParse } from './chunk-BOYP3ARU.js';
import { isEqual } from './chunk-GXKQ3LHF.js';
import { isEmptyArray } from './chunk-GOFINGT6.js';
import { assertIsArray } from './chunk-RZOGBYIS.js';
import { safeStableStringify } from './chunk-AXDYWO67.js';
import { isPlainObject, isNonEmptyArray, isObjectOrArray, isArray, isNaN, isUndefined } from './chunk-MSUW5VHZ.js';
var findDuplicates = (values) => {
assertIsArray(values, {
message: ({ currentType, validType }) => `First parameter (\`values\`) must be of type \`${validType}\` (array literal or instance), but received: \`${currentType}\`.`
});
const duplicates = [];
values.forEach((item, index) => {
for (let i = index + 1; i < values.length; i++) {
if (isEqual(item, values[i])) {
if (!duplicates.some((dup) => isEqual(dup, item))) {
duplicates.push(item);
}
break;
}
}
});
return duplicates;
};
var omitKeys = (object, keysToOmit) => {
if (!isPlainObject(object)) return {};
assertIsArray(keysToOmit, {
message: ({ currentType, validType }) => `Second parameter (\`keysToOmit\`) must be of type \`${validType}\` (array literal or instance), but received: \`${currentType}\`.`
});
const duplicates = findDuplicates(keysToOmit);
if (duplicates.length > 0) {
throw new Error(
`Function "omitKeys" Error: Duplicate keys detected - \`${duplicates}\``
);
}
return Object.fromEntries(
Object.entries(object).filter(([key]) => !keysToOmit.includes(key))
);
};
var omitKeysDeep = (object, keysToOmit) => {
if (!isPlainObject(object)) return {};
assertIsArray(keysToOmit, {
message: ({ currentType, validType }) => `Second parameter (\`keysToOmit\`) must be of type \`${validType}\` (array literal or instance), but received: \`${currentType}\`.`
});
const duplicates = findDuplicates(keysToOmit);
if (isNonEmptyArray(duplicates)) {
throw new Error(
`Function "omitKeysDeep" Error: Duplicate keys detected - \`${safeStableStringify(
duplicates,
{
keepUndefined: true
}
)}\`.`
);
}
const omitAtPath = (obj, pathParts) => {
if (!isObjectOrArray(obj)) return obj;
const [current, ...rest] = pathParts;
if (isEmptyArray(rest)) {
if (isArray(obj)) {
const index = parseInt(current);
if (!isNaN(index) && index in obj) {
obj.splice(index, 1);
}
} else {
delete obj[current];
}
} else {
const next = obj[current];
if (isObjectOrArray(next)) {
obj[current] = omitAtPath(next, rest);
}
}
return obj;
};
const deepRemoveEmptyObjects = (obj) => {
if (isArray(obj)) {
return obj.map(deepRemoveEmptyObjects).filter((item) => !(isObjectOrArray(item) && Object.keys(item).length === 0));
}
if (isObjectOrArray(obj)) {
const cleaned = Object.fromEntries(
Object.entries(obj).map(([k, v]) => [k, deepRemoveEmptyObjects(v)]).filter(
([, v]) => !isUndefined(v) && !(isObjectOrArray(v) && Object.keys(v).length === 0)
)
);
return cleaned;
}
return obj;
};
const result = safeJsonParse(safeStableStringify(object));
for (const key of keysToOmit) {
const parts = key.split(".");
omitAtPath(result, parts);
}
return deepRemoveEmptyObjects(result);
};
export { findDuplicates, omitKeys, omitKeysDeep };