mentalHealth/01-Web/packages/utils/common/objects.ts

110 lines
3.3 KiB
TypeScript
Raw Normal View History

2024-02-18 06:52:01 +00:00
import { z } from 'zod';
/**
*
* - `Object.keys` `string[]`
*
* @param {O} object
* @returns {(keyof O)[]}
*/
export function ObjectKeys<O extends Recordable>(object: O): (keyof O)[] {
return Object.keys(object);
}
/**
*
*
* @param {O} object
*/
export function ObjectValues<O extends Recordable>(object: O): O[keyof O][] {
return Object.values(object) as O[keyof O][];
}
/**
* /
* - `ObjectEntriesRecord`
*
* @param {O} object
*/
export function ObjectEntries<O extends Recordable>(object: O) {
return Object.entries(object) as [keyof O, O[keyof O]][];
}
/**
* /
* - `ObjectEntries`
*
* @param {{ [K in keyof O]: O[K] }} object
*/
export function ObjectEntriesRecord<O extends Recordable<keyof O>>(object: { [K in keyof O]: O[K] }) {
return Object.entries(object) as [keyof O, O[keyof O]][];
}
/**
* /
*
* @param {O} object
*/
export function ObjectSwitch<O extends Recordable<keyof O, string | number>>(object: Required<O>) {
const result = {} as unknown as Recordable<O[keyof O], keyof O>;
for (const [k, v] of EnumEntries(object)) {
result[v] = k;
}
return result;
}
/**
*
*
* @param {E} enums
*/
export function EnumKeys<E extends Recordable<keyof E>>(enums: E): [keyof E, ...(keyof E)[]] {
const e = z.record(z.unknown()).parse(enums) as E;
const keys = z
.array(z.string())
.nonempty({ message: 'Enum Keys must contain at least 1 element(s)' })
.parse(ObjectKeys(e)) as [keyof E, ...(keyof E)[]];
const values = ObjectValues(e);
const isNumEnum = keys.every((k) => values.some((v) => `${v}` === k));
if (isNumEnum) return keys.splice(keys.length / 2, keys.length / 2) as [keyof E, ...(keyof E)[]];
return keys;
}
/**
*
*
* @param {E} enums
*/
export function EnumValues<E extends Recordable<keyof E>>(enums: E): E[keyof E][] {
const e = z.record(z.unknown()).parse(enums) as E;
const keys = z
.array(z.string())
.nonempty({ message: 'Enum Keys must contain at least 1 element(s)' })
.parse(ObjectKeys(e));
const values = ObjectValues(e);
const isNumEnum = keys.every((k) => values.some((v) => `${v}` === k));
if (isNumEnum) return values.splice(keys.length / 2, keys.length / 2);
return values;
}
/**
* /
*
* @param {E} enums
*/
export function EnumEntries<E extends Recordable<keyof E>>(enums: E): [keyof E, E[keyof E]][] {
const e = z.record(z.unknown()).parse(enums) as E;
const keys = z
.array(z.string())
.nonempty({ message: 'Enum Keys must contain at least 1 element(s)' })
.parse(ObjectKeys(e));
const values = ObjectValues(e);
const entries = ObjectEntries(e);
const isNumEnum = keys.every((k) => values.some((v) => `${v}` === k));
if (isNumEnum) return entries.splice(keys.length / 2, keys.length / 2);
return entries;
}