predictype
Version:
PredicType is a library of pre-built and tested predicates for TypeScript, covering various data types and operations.
47 lines (46 loc) • 2.61 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.objectKeysCompare = objectKeysCompare;
const objects_js_1 = require("../../enums/objects.js");
/**
* Checks object keys for key-comparison operations (CONTAINS_, LACKS_, EQUALS_, etc.).
*
* @param source The object to check.
* @param oper The key operation to perform (e.g. 'contains_all_keys', 'lacks_all_keys', 'equals_keys', ...).
* @param keys The array of keys to check (string[] | symbol[]).
* @returns True if the key check is valid according to the operator, otherwise false.
*
* @throws {Error} If the operation is not recognized or keys is missing.
*
* @remarks
* Supported Operators:
* - **CONTAINS_ALL_KEYS**: Object contains all the given keys
* - **CONTAINS_ANY_KEY**: Object contains at least one of the keys
* - **CONTAINS_ONLY_KEYS**: Object contains only the given keys
* - **CONTAINS_SYMBOL_KEYS**: Object contains at least one symbol key
* - **EQUALS_KEYS**: Object keys equal the given keys
* - **LACKS_ALL_KEYS**: Object lacks all the given keys
* - **ONLY_KEYS**: All object keys are in the given set
* - **STRICT_EQUALS_KEYS**: Object keys strictly equal the given keys
*/
function objectKeysCompare(source, oper, keys) {
const allKeys = [...Object.getOwnPropertyNames(source), ...Object.getOwnPropertySymbols(source)];
const operators = {
[objects_js_1.ObjectKeysEnum.CONTAINS_ALL_KEYS]: (k) => k.every((key) => allKeys.includes(key)),
[objects_js_1.ObjectKeysEnum.CONTAINS_ANY_KEY]: (k) => k.some((key) => allKeys.includes(key)),
// eslint-disable-next-line arrow-body-style
[objects_js_1.ObjectKeysEnum.CONTAINS_ONLY_KEYS]: (k) => {
return allKeys.every((key) => k.includes(key)) && k.every((key) => allKeys.includes(key));
},
[objects_js_1.ObjectKeysEnum.CONTAINS_SYMBOL_KEYS]: (_k) => Object.getOwnPropertySymbols(source).length > 0,
[objects_js_1.ObjectKeysEnum.EQUALS_KEYS]: (k) => k.length === allKeys.length && k.every((key) => allKeys.includes(key)),
[objects_js_1.ObjectKeysEnum.ONLY_KEYS]: (k) => allKeys.every((key) => k.includes(key)),
[objects_js_1.ObjectKeysEnum.LACKS_ALL_KEYS]: (k) => k.every((key) => !allKeys.includes(key)),
[objects_js_1.ObjectKeysEnum.STRICT_EQUALS_KEYS]: (k) => k.length === allKeys.length && k.every((key, i) => allKeys[i] === key),
};
const enumOper = typeof oper === 'string' ? oper : oper;
const fn = operators[enumOper];
if (!fn)
throw new Error(`Unknown ObjectKeys operation: ${oper}`);
return fn(keys);
}
;