diff --git a/src/types/Camelize.ts b/src/types/Camelize.ts new file mode 100644 index 00000000..4aa88e5c --- /dev/null +++ b/src/types/Camelize.ts @@ -0,0 +1,12 @@ +export type StringToCamelCase = + S extends `${infer T}_${infer U}` ? + U extends "" ? `${T}_` : `${T}${StringToCamelCase>}` + : S; + +export type ToCamelCase = { + [Key in keyof T as StringToCamelCase]: T[Key] extends Array + ? Array> + : T[Key] extends object + ? ToCamelCase + : T[Key] +}; diff --git a/src/utils/camelize.ts b/src/utils/camelize.ts new file mode 100644 index 00000000..6730252c --- /dev/null +++ b/src/utils/camelize.ts @@ -0,0 +1,20 @@ +import { ToCamelCase } from "@/types/Camelize"; + +function stringToCamelCase(str: string): string { + return str.replace(/_([a-z])/g, (_match, letter) => { + return letter.toUpperCase(); + }); +} + +export function toCamelCase(obj: T): ToCamelCase { + if (Array.isArray(obj)) { + return obj.map(item => toCamelCase(item)) as ToCamelCase; + } else if (obj !== null && typeof obj === "object") { + return Object.keys(obj).reduce((acc, key) => { + const camelKey = stringToCamelCase(key); + acc[camelKey] = toCamelCase(obj[key]); + return acc; + }, {}) as ToCamelCase; + } + return obj as ToCamelCase; +}