fix(common): Object types and functions

This commit is contained in:
socram03 2023-06-12 16:57:04 +00:00
parent 3ddd6d51dc
commit 620accd286
2 changed files with 16 additions and 9 deletions

View File

@ -31,9 +31,16 @@ export type SnakeCase<S extends string> = S extends `${infer A}${infer Rest}`
: Lowercase<S>; : Lowercase<S>;
export type ObjectToLower<T> = Identify<{ export type ObjectToLower<T> = Identify<{
[K in keyof T as CamelCase<Exclude<K, symbol | number>>]: T[K] extends object ? Identify<ObjectToLower<T[K]>> : T[K]; [K in keyof T as CamelCase<Exclude<K, symbol | number>>]: T[K] extends unknown[]
? Identify<ObjectToLower<T[K][0]>[]>
: T[K] extends object
? Identify<ObjectToLower<T[K]>>
: T[K];
}>; }>;
export type ObjectToSnake<T> = Identify<{ export type ObjectToSnake<T> = Identify<{
[K in keyof T as SnakeCase<Exclude<K, symbol | number>>]: T[K] extends object ? Identify<ObjectToSnake<T[K]>> : T[K]; [K in keyof T as SnakeCase<Exclude<K, symbol | number>>]: T[K] extends unknown[]
? Identify<ObjectToSnake<T[K][0]>[]>
: T[K] extends object
? Identify<ObjectToSnake<T[K]>>
: T[K];
}>; }>;

View File

@ -1,12 +1,12 @@
import { setTimeout } from 'node:timers/promises'; import { setTimeout } from 'node:timers/promises';
import { ObjectToSnake, ObjectToLower } from './Types'; import { ObjectToLower, ObjectToSnake } from './Types';
const isPlainObject = (value: any) => { const isPlainObject = (value: any) => {
return ( return (
(value !== null && (value !== null &&
typeof value === 'object' && typeof value === 'object' &&
typeof value.constructor === 'function' && typeof value.constructor === 'function' &&
// eslint-disable-next-line no-prototype-builtins // rome-ignore lint/suspicious/noPrototypeBuiltins: js tricks
(value.constructor.prototype.hasOwnProperty('isPrototypeOf') || Object.getPrototypeOf(value.constructor.prototype) === null)) || (value.constructor.prototype.hasOwnProperty('isPrototypeOf') || Object.getPrototypeOf(value.constructor.prototype) === null)) ||
(value && Object.getPrototypeOf(value) === null) (value && Object.getPrototypeOf(value) === null)
); );
@ -48,7 +48,7 @@ export const Options = <T = any>(defaults: any, ...options: any[]): T => {
* @param target The object to convert. * @param target The object to convert.
* @returns The converted object. * @returns The converted object.
*/ */
export function toSnakeCase<Obj extends { [k: string]: unknown }>(target: Obj): ObjectToSnake<Obj> { export function toSnakeCase<Obj extends Record<string, unknown>>(target: Obj): ObjectToSnake<Obj> {
const result = {}; const result = {};
for (const [key, value] of Object.entries(target)) { for (const [key, value] of Object.entries(target)) {
switch (typeof value) { switch (typeof value) {
@ -62,7 +62,7 @@ export function toSnakeCase<Obj extends { [k: string]: unknown }>(target: Obj):
break; break;
case 'object': case 'object':
if (Array.isArray(value)) { if (Array.isArray(value)) {
result[ReplaceRegex.camel(key)] = Promise.all(value.map((prop) => toSnakeCase(prop))); result[ReplaceRegex.camel(key)] = value.map((prop) => toSnakeCase(prop));
break; break;
} }
if (!Number.isNaN(value)) { if (!Number.isNaN(value)) {
@ -81,7 +81,7 @@ export function toSnakeCase<Obj extends { [k: string]: unknown }>(target: Obj):
* @param target The object to convert. * @param target The object to convert.
* @returns The converted object. * @returns The converted object.
*/ */
export function toCamelCase<Obj extends { [k: string]: unknown }>(target: Obj): ObjectToLower<Obj> { export function toCamelCase<Obj extends Record<string, unknown>>(target: Obj): ObjectToLower<Obj> {
const result = {}; const result = {};
for (const [key, value] of Object.entries(target)) { for (const [key, value] of Object.entries(target)) {
switch (typeof value) { switch (typeof value) {
@ -95,7 +95,7 @@ export function toCamelCase<Obj extends { [k: string]: unknown }>(target: Obj):
break; break;
case 'object': case 'object':
if (Array.isArray(value)) { if (Array.isArray(value)) {
result[ReplaceRegex.snake(key)] = Promise.all(value.map((prop) => toCamelCase(prop))); result[ReplaceRegex.snake(key)] = value.map((prop) => toCamelCase(prop));
break; break;
} }
if (!Number.isNaN(value)) { if (!Number.isNaN(value)) {