@digicroz/js-kit 1.0.14 → 1.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,24 +1,18 @@
1
1
  type SnakeToCamel<S extends string> = S extends `${infer T}_${infer U}` ? `${T}${Capitalize<SnakeToCamel<U>>}` : S;
2
2
  type ToCamelCaseResult<T extends string> = SnakeToCamel<T>;
3
- type ObjectKeysToCamelCaseResult<T> = {
4
- [K in keyof T as SnakeToCamel<Extract<K, string>>]: T[K] extends readonly any[] ? ObjectKeysToCamelCaseResult<T[K][number]>[] : T[K] extends object ? ObjectKeysToCamelCaseResult<T[K]> : T[K];
5
- };
3
+ type ObjectKeysToCamelCaseResult<T, IgnoredPaths extends string = never, CurrentPath extends string = ""> = T extends readonly any[] ? ObjectKeysToCamelCaseResult<T[number], IgnoredPaths, CurrentPath>[] : T extends Date | RegExp | Function ? T : T extends object ? {
4
+ [K in keyof T as SnakeToCamel<Extract<K, string>>]: `${CurrentPath}${CurrentPath extends "" ? "" : "."}${Extract<K, string>}` extends IgnoredPaths ? T[K] : ObjectKeysToCamelCaseResult<T[K], IgnoredPaths, `${CurrentPath}${CurrentPath extends "" ? "" : "."}${Extract<K, string>}`>;
5
+ } : T;
6
6
  /**
7
7
  * Converts a snake_case string to camelCase
8
- *
9
- * @example
10
- * toCamelCase('my_variable') // 'myVariable'
11
- * toCamelCase('user_first_name') // 'userFirstName'
12
8
  */
13
9
  declare const toCamelCase: <T extends string>(str: T) => ToCamelCaseResult<T>;
10
+ type Options<Paths extends string = string> = {
11
+ ignoredPaths?: readonly Paths[];
12
+ };
14
13
  /**
15
14
  * Converts all keys in an object from snake_case to camelCase recursively
16
- * Handles nested objects and arrays
17
- *
18
- * @example
19
- * objectKeysToCamelCase({ first_name: 'John', user_info: { phone_number: '123' } })
20
- * // { firstName: 'John', userInfo: { phoneNumber: '123' } }
21
15
  */
22
- declare function objectKeysToCamelCase<T extends Record<string, any>>(obj: T): ObjectKeysToCamelCaseResult<T>;
16
+ declare function objectKeysToCamelCase<T extends Record<string, any>, IgnoredPaths extends string = never>(obj: T, options?: Options<IgnoredPaths>, currentPath?: string): ObjectKeysToCamelCaseResult<T, IgnoredPaths>;
23
17
 
24
18
  export { type ObjectKeysToCamelCaseResult, type ToCamelCaseResult, objectKeysToCamelCase, toCamelCase };
@@ -1,24 +1,18 @@
1
1
  type SnakeToCamel<S extends string> = S extends `${infer T}_${infer U}` ? `${T}${Capitalize<SnakeToCamel<U>>}` : S;
2
2
  type ToCamelCaseResult<T extends string> = SnakeToCamel<T>;
3
- type ObjectKeysToCamelCaseResult<T> = {
4
- [K in keyof T as SnakeToCamel<Extract<K, string>>]: T[K] extends readonly any[] ? ObjectKeysToCamelCaseResult<T[K][number]>[] : T[K] extends object ? ObjectKeysToCamelCaseResult<T[K]> : T[K];
5
- };
3
+ type ObjectKeysToCamelCaseResult<T, IgnoredPaths extends string = never, CurrentPath extends string = ""> = T extends readonly any[] ? ObjectKeysToCamelCaseResult<T[number], IgnoredPaths, CurrentPath>[] : T extends Date | RegExp | Function ? T : T extends object ? {
4
+ [K in keyof T as SnakeToCamel<Extract<K, string>>]: `${CurrentPath}${CurrentPath extends "" ? "" : "."}${Extract<K, string>}` extends IgnoredPaths ? T[K] : ObjectKeysToCamelCaseResult<T[K], IgnoredPaths, `${CurrentPath}${CurrentPath extends "" ? "" : "."}${Extract<K, string>}`>;
5
+ } : T;
6
6
  /**
7
7
  * Converts a snake_case string to camelCase
8
- *
9
- * @example
10
- * toCamelCase('my_variable') // 'myVariable'
11
- * toCamelCase('user_first_name') // 'userFirstName'
12
8
  */
13
9
  declare const toCamelCase: <T extends string>(str: T) => ToCamelCaseResult<T>;
10
+ type Options<Paths extends string = string> = {
11
+ ignoredPaths?: readonly Paths[];
12
+ };
14
13
  /**
15
14
  * Converts all keys in an object from snake_case to camelCase recursively
16
- * Handles nested objects and arrays
17
- *
18
- * @example
19
- * objectKeysToCamelCase({ first_name: 'John', user_info: { phone_number: '123' } })
20
- * // { firstName: 'John', userInfo: { phoneNumber: '123' } }
21
15
  */
22
- declare function objectKeysToCamelCase<T extends Record<string, any>>(obj: T): ObjectKeysToCamelCaseResult<T>;
16
+ declare function objectKeysToCamelCase<T extends Record<string, any>, IgnoredPaths extends string = never>(obj: T, options?: Options<IgnoredPaths>, currentPath?: string): ObjectKeysToCamelCaseResult<T, IgnoredPaths>;
23
17
 
24
18
  export { type ObjectKeysToCamelCaseResult, type ToCamelCaseResult, objectKeysToCamelCase, toCamelCase };
@@ -5,14 +5,34 @@ var toCamelCase = (str) => {
5
5
  (_, char) => char.toUpperCase()
6
6
  );
7
7
  };
8
- function objectKeysToCamelCase(obj) {
8
+ function objectKeysToCamelCase(obj, options, currentPath = "") {
9
9
  if (obj === null || typeof obj !== "object") return obj;
10
+ if (obj instanceof Date || obj instanceof RegExp || typeof obj === "function") {
11
+ return obj;
12
+ }
10
13
  if (Array.isArray(obj)) {
11
- return obj.map(objectKeysToCamelCase);
14
+ return obj.map(
15
+ (item, index) => objectKeysToCamelCase(
16
+ item,
17
+ options,
18
+ `${currentPath}[${index}]`
19
+ )
20
+ );
12
21
  }
13
22
  return Object.keys(obj).reduce((acc, key) => {
14
23
  const camelKey = toCamelCase(key);
15
- acc[camelKey] = objectKeysToCamelCase(obj[key]);
24
+ const nextPath = currentPath ? `${currentPath}.${key}` : key;
25
+ if (options?.ignoredPaths?.some(
26
+ (path) => nextPath === path || nextPath.startsWith(path + ".")
27
+ )) {
28
+ acc[camelKey] = obj[key];
29
+ return acc;
30
+ }
31
+ acc[camelKey] = objectKeysToCamelCase(
32
+ obj[key],
33
+ options,
34
+ nextPath
35
+ );
16
36
  return acc;
17
37
  }, {});
18
38
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/string/caseConversion/snakeToCamel.ts"],"names":[],"mappings":";AA0BO,IAAM,WAAA,GAAc,CAAmB,GAAA,KAAiC;AAC7E,EAAA,OAAO,GAAA,CAAI,OAAA;AAAA,IAAQ,WAAA;AAAA,IAAa,CAAC,CAAA,EAAG,IAAA,KAClC,IAAA,CAAK,WAAA;AAAY,GACnB;AACF;AAUO,SAAS,sBACd,GAAA,EACgC;AAChC,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,UAAU,OAAO,GAAA;AAEpD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,OAAO,GAAA,CAAI,IAAI,qBAAqB,CAAA;AAAA;AAGtC,EAAA,OAAO,OAAO,IAAA,CAAK,GAAG,EAAE,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ;AAC3C,IAAA,MAAM,QAAA,GAAW,YAAY,GAAG,CAAA;AAChC,IAAA,GAAA,CAAI,QAAQ,CAAA,GAAI,qBAAA,CAAsB,GAAA,CAAI,GAAG,CAAC,CAAA;AAC9C,IAAA,OAAO,GAAA;AAAA,GACT,EAAG,EAAS,CAAA;AACd","file":"snakeToCamel.js","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// Convert snake_case string to camelCase\r\ntype SnakeToCamel<S extends string> = S extends `${infer T}_${infer U}`\r\n ? `${T}${Capitalize<SnakeToCamel<U>>}`\r\n : S\r\n\r\nexport type ToCamelCaseResult<T extends string> = SnakeToCamel<T>\r\n\r\n// Convert object keys recursively\r\nexport type ObjectKeysToCamelCaseResult<T> = {\r\n [K in keyof T as SnakeToCamel<\r\n Extract<K, string>\r\n >]: T[K] extends readonly any[]\r\n ? ObjectKeysToCamelCaseResult<T[K][number]>[]\r\n : T[K] extends object\r\n ? ObjectKeysToCamelCaseResult<T[K]>\r\n : T[K]\r\n}\r\n\r\n/**\r\n * Converts a snake_case string to camelCase\r\n *\r\n * @example\r\n * toCamelCase('my_variable') // 'myVariable'\r\n * toCamelCase('user_first_name') // 'userFirstName'\r\n */\r\nexport const toCamelCase = <T extends string>(str: T): ToCamelCaseResult<T> => {\r\n return str.replace(/_([a-z])/g, (_, char) =>\r\n char.toUpperCase()\r\n ) as ToCamelCaseResult<T>\r\n}\r\n\r\n/**\r\n * Converts all keys in an object from snake_case to camelCase recursively\r\n * Handles nested objects and arrays\r\n *\r\n * @example\r\n * objectKeysToCamelCase({ first_name: 'John', user_info: { phone_number: '123' } })\r\n * // { firstName: 'John', userInfo: { phoneNumber: '123' } }\r\n */\r\nexport function objectKeysToCamelCase<T extends Record<string, any>>(\r\n obj: T\r\n): ObjectKeysToCamelCaseResult<T> {\r\n if (obj === null || typeof obj !== \"object\") return obj as any\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(objectKeysToCamelCase) as any\r\n }\r\n\r\n return Object.keys(obj).reduce((acc, key) => {\r\n const camelKey = toCamelCase(key)\r\n acc[camelKey] = objectKeysToCamelCase(obj[key])\r\n return acc\r\n }, {} as any)\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../../src/string/caseConversion/snakeToCamel.ts"],"names":[],"mappings":";AAgCO,IAAM,WAAA,GAAc,CAAmB,GAAA,KAAiC;AAC7E,EAAA,OAAO,GAAA,CAAI,OAAA;AAAA,IAAQ,WAAA;AAAA,IAAa,CAAC,CAAA,EAAG,IAAA,KAClC,IAAA,CAAK,WAAA;AAAY,GACnB;AACF;AAUO,SAAS,qBAAA,CAId,GAAA,EACA,OAAA,EACA,WAAA,GAAsB,EAAA,EACwB;AAC9C,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,UAAU,OAAO,GAAA;AAEpD,EAAA,IACE,eAAe,IAAA,IACf,GAAA,YAAe,MAAA,IACf,OAAO,QAAQ,UAAA,EACf;AACA,IAAA,OAAO,GAAA;AAAA;AAGT,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,OAAO,GAAA,CAAI,GAAA;AAAA,MAAI,CAAC,MAAM,KAAA,KACpB,qBAAA;AAAA,QACE,IAAA;AAAA,QACA,OAAA;AAAA,QACA,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA;AACzB,KACF;AAAA;AAGF,EAAA,OAAO,OAAO,IAAA,CAAK,GAAG,EAAE,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ;AAC3C,IAAA,MAAM,QAAA,GAAW,YAAY,GAAG,CAAA;AAEhC,IAAA,MAAM,WAAW,WAAA,GACb,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GACrB,GAAA;AAEJ,IAAA,IACE,SAAS,YAAA,EAAc,IAAA;AAAA,MAAK,UAC1B,QAAA,KAAa,IAAA,IAAQ,QAAA,CAAS,UAAA,CAAW,OAAO,GAAG;AAAA,KACrD,EACA;AACA,MAAA,GAAA,CAAI,QAAQ,CAAA,GAAI,GAAA,CAAI,GAAG,CAAA;AACvB,MAAA,OAAO,GAAA;AAAA;AAGT,IAAA,GAAA,CAAI,QAAQ,CAAA,GAAI,qBAAA;AAAA,MACd,IAAI,GAAG,CAAA;AAAA,MACP,OAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,GAAA;AAAA,GACT,EAAG,EAAS,CAAA;AACd","file":"snakeToCamel.js","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// Convert snake_case string to camelCase\r\ntype SnakeToCamel<S extends string> = S extends `${infer T}_${infer U}`\r\n ? `${T}${Capitalize<SnakeToCamel<U>>}`\r\n : S;\r\n\r\nexport type ToCamelCaseResult<T extends string> = SnakeToCamel<T>;\r\n\r\nexport type ObjectKeysToCamelCaseResult<\r\n T,\r\n IgnoredPaths extends string = never,\r\n CurrentPath extends string = \"\"\r\n> = T extends readonly any[]\r\n ? ObjectKeysToCamelCaseResult<T[number], IgnoredPaths, CurrentPath>[]\r\n : T extends Date | RegExp | Function\r\n ? T\r\n : T extends object\r\n ? {\r\n [K in keyof T as SnakeToCamel<Extract<K, string>>]:\r\n `${CurrentPath}${CurrentPath extends \"\" ? \"\" : \".\"}${Extract<K, string>}` extends IgnoredPaths\r\n ? T[K] \r\n : ObjectKeysToCamelCaseResult<\r\n T[K],\r\n IgnoredPaths,\r\n `${CurrentPath}${CurrentPath extends \"\" ? \"\" : \".\"}${Extract<K, string>}`\r\n >;\r\n }\r\n : T;\r\n\r\n/**\r\n * Converts a snake_case string to camelCase\r\n */\r\nexport const toCamelCase = <T extends string>(str: T): ToCamelCaseResult<T> => {\r\n return str.replace(/_([a-z])/g, (_, char) =>\r\n char.toUpperCase(),\r\n ) as ToCamelCaseResult<T>;\r\n};\r\n\r\n\r\ntype Options<Paths extends string = string> = {\r\n ignoredPaths?: readonly Paths[];\r\n};\r\n\r\n/**\r\n * Converts all keys in an object from snake_case to camelCase recursively\r\n */\r\nexport function objectKeysToCamelCase<\r\n T extends Record<string, any>,\r\n IgnoredPaths extends string = never\r\n>(\r\n obj: T,\r\n options?: Options<IgnoredPaths>,\r\n currentPath: string = \"\"\r\n): ObjectKeysToCamelCaseResult<T, IgnoredPaths> {\r\n if (obj === null || typeof obj !== \"object\") return obj as any;\r\n\r\n if (\r\n obj instanceof Date ||\r\n obj instanceof RegExp ||\r\n typeof obj === \"function\"\r\n ) {\r\n return obj as any;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map((item, index) =>\r\n objectKeysToCamelCase(\r\n item,\r\n options,\r\n `${currentPath}[${index}]`\r\n )\r\n ) as any;\r\n }\r\n\r\n return Object.keys(obj).reduce((acc, key) => {\r\n const camelKey = toCamelCase(key);\r\n\r\n const nextPath = currentPath\r\n ? `${currentPath}.${key}`\r\n : key;\r\n\r\n if (\r\n options?.ignoredPaths?.some(path =>\r\n nextPath === path || nextPath.startsWith(path + \".\")\r\n )\r\n ) {\r\n acc[camelKey] = obj[key];\r\n return acc;\r\n }\r\n\r\n acc[camelKey] = objectKeysToCamelCase(\r\n obj[key],\r\n options,\r\n nextPath\r\n );\r\n\r\n return acc;\r\n }, {} as any);\r\n}"]}
@@ -40,6 +40,9 @@ var toSnakeCase = (value) => {
40
40
  };
41
41
  function objectKeysToSnakeCase(obj) {
42
42
  if (obj === null || typeof obj !== "object") return obj;
43
+ if (obj instanceof Date) {
44
+ return obj;
45
+ }
43
46
  if (Array.isArray(obj)) {
44
47
  return obj.map(objectKeysToSnakeCase);
45
48
  }
@@ -57,14 +60,34 @@ var toCamelCase = (str) => {
57
60
  (_, char) => char.toUpperCase()
58
61
  );
59
62
  };
60
- function objectKeysToCamelCase(obj) {
63
+ function objectKeysToCamelCase(obj, options, currentPath = "") {
61
64
  if (obj === null || typeof obj !== "object") return obj;
65
+ if (obj instanceof Date || obj instanceof RegExp || typeof obj === "function") {
66
+ return obj;
67
+ }
62
68
  if (Array.isArray(obj)) {
63
- return obj.map(objectKeysToCamelCase);
69
+ return obj.map(
70
+ (item, index) => objectKeysToCamelCase(
71
+ item,
72
+ options,
73
+ `${currentPath}[${index}]`
74
+ )
75
+ );
64
76
  }
65
77
  return Object.keys(obj).reduce((acc, key) => {
66
78
  const camelKey = toCamelCase(key);
67
- acc[camelKey] = objectKeysToCamelCase(obj[key]);
79
+ const nextPath = currentPath ? `${currentPath}.${key}` : key;
80
+ if (options?.ignoredPaths?.some(
81
+ (path) => nextPath === path || nextPath.startsWith(path + ".")
82
+ )) {
83
+ acc[camelKey] = obj[key];
84
+ return acc;
85
+ }
86
+ acc[camelKey] = objectKeysToCamelCase(
87
+ obj[key],
88
+ options,
89
+ nextPath
90
+ );
68
91
  return acc;
69
92
  }, {});
70
93
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/string/capitalize.ts","../../src/string/truncate.ts","../../src/string/caseConversion/camelToSnake.ts","../../src/string/caseConversion/snakeToCamel.ts","../../src/string/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * Capitalizes the first letter of a string\r\n * @param str - The string to capitalize\r\n * @returns The capitalized string\r\n */\r\nexport function capitalize(str: string): string {\r\n if (typeof str !== 'string') {\r\n throw new Error('Input must be a string');\r\n }\r\n \r\n if (str.length === 0) {\r\n return str;\r\n }\r\n \r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n\r\n/**\r\n * Capitalizes the first letter of each word in a string\r\n * @param str - The string to capitalize\r\n * @returns The string with each word capitalized\r\n */\r\nexport function capitalizeWords(str: string): string {\r\n if (typeof str !== 'string') {\r\n throw new Error('Input must be a string');\r\n }\r\n \r\n return str.replace(/\\b\\w/g, (char) => char.toUpperCase());\r\n}\r\n\r\nexport function convertCamelToNormalCapitalized(\r\n camelCaseString: string\r\n): string {\r\n // Split the camelCase string into words\r\n const words = camelCaseString\r\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\r\n .split(/[\\s_]+/);\r\n\r\n // Capitalize each word\r\n const capitalizedWords = words.map(\r\n (word) => word.charAt(0).toUpperCase() + word.slice(1)\r\n );\r\n\r\n // Join the capitalized words to form the normal capitalized string\r\n const normalCapitalizedString = capitalizedWords.join(\" \");\r\n\r\n return normalCapitalizedString;\r\n}","\r\nexport type TruncateTextOptions = {\r\n text: string;\r\n maxLength?: number;\r\n suffix?: string;\r\n};\r\n\r\nexport function truncateText({\r\n text,\r\n maxLength = 10,\r\n suffix = '...',\r\n}: TruncateTextOptions): string {\r\n return text.length > maxLength\r\n ? text.substring(0, maxLength) + suffix\r\n : text;\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// camelCase → snake_case (string)\r\ntype CamelToSnake<S extends string> = S extends `${infer T}${infer U}`\r\n ? U extends Uncapitalize<U>\r\n ? `${Lowercase<T>}${CamelToSnake<U>}`\r\n : `${Lowercase<T>}_${CamelToSnake<U>}`\r\n : S\r\n\r\nexport type ToSnakeCaseResult<T extends string> = CamelToSnake<T>\r\n// object keys\r\nexport type ObjectKeysToSnakeCaseResult<T> = {\r\n [K in keyof T as CamelToSnake<\r\n Extract<K, string>\r\n >]: T[K] extends readonly any[]\r\n ? ObjectKeysToSnakeCaseResult<T[K][number]>[]\r\n : T[K] extends object\r\n ? ObjectKeysToSnakeCaseResult<T[K]>\r\n : T[K]\r\n}\r\n\r\n/**\r\n * Converts a camelCase string to snake_case\r\n * Handles leading uppercase letters correctly\r\n *\r\n * @example\r\n * toSnakeCase('myVariable') // 'my_variable'\r\n * toSnakeCase('MyVariable') // 'my_variable'\r\n * toSnakeCase('XMLParser') // 'xml_parser'\r\n */\r\nexport const toSnakeCase = <T extends string>(\r\n value: T\r\n): ToSnakeCaseResult<T> => {\r\n return value\r\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1_$2\") // Handle consecutive caps like XMLParser\r\n .replace(/([a-z\\d])([A-Z])/g, \"$1_$2\") // Handle normal camelCase\r\n .toLowerCase() as ToSnakeCaseResult<T>\r\n}\r\n\r\n/**\r\n * Converts all keys in an object from camelCase to snake_case recursively\r\n * Handles nested objects and arrays\r\n *\r\n * @example\r\n * objectKeysToSnakeCase({ firstName: 'John', userInfo: { phoneNumber: '123' } })\r\n * // { first_name: 'John', user_info: { phone_number: '123' } }\r\n */\r\nexport function objectKeysToSnakeCase<T extends Record<string, any>>(\r\n obj: T\r\n): ObjectKeysToSnakeCaseResult<T> {\r\n if (obj === null || typeof obj !== \"object\") return obj as any\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(objectKeysToSnakeCase) as any\r\n }\r\n\r\n return Object.keys(obj).reduce((acc, key) => {\r\n const snakeKey = toSnakeCase(key)\r\n acc[snakeKey] = objectKeysToSnakeCase(obj[key])\r\n return acc\r\n }, {} as any)\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// Convert snake_case string to camelCase\r\ntype SnakeToCamel<S extends string> = S extends `${infer T}_${infer U}`\r\n ? `${T}${Capitalize<SnakeToCamel<U>>}`\r\n : S\r\n\r\nexport type ToCamelCaseResult<T extends string> = SnakeToCamel<T>\r\n\r\n// Convert object keys recursively\r\nexport type ObjectKeysToCamelCaseResult<T> = {\r\n [K in keyof T as SnakeToCamel<\r\n Extract<K, string>\r\n >]: T[K] extends readonly any[]\r\n ? ObjectKeysToCamelCaseResult<T[K][number]>[]\r\n : T[K] extends object\r\n ? ObjectKeysToCamelCaseResult<T[K]>\r\n : T[K]\r\n}\r\n\r\n/**\r\n * Converts a snake_case string to camelCase\r\n *\r\n * @example\r\n * toCamelCase('my_variable') // 'myVariable'\r\n * toCamelCase('user_first_name') // 'userFirstName'\r\n */\r\nexport const toCamelCase = <T extends string>(str: T): ToCamelCaseResult<T> => {\r\n return str.replace(/_([a-z])/g, (_, char) =>\r\n char.toUpperCase()\r\n ) as ToCamelCaseResult<T>\r\n}\r\n\r\n/**\r\n * Converts all keys in an object from snake_case to camelCase recursively\r\n * Handles nested objects and arrays\r\n *\r\n * @example\r\n * objectKeysToCamelCase({ first_name: 'John', user_info: { phone_number: '123' } })\r\n * // { firstName: 'John', userInfo: { phoneNumber: '123' } }\r\n */\r\nexport function objectKeysToCamelCase<T extends Record<string, any>>(\r\n obj: T\r\n): ObjectKeysToCamelCaseResult<T> {\r\n if (obj === null || typeof obj !== \"object\") return obj as any\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(objectKeysToCamelCase) as any\r\n }\r\n\r\n return Object.keys(obj).reduce((acc, key) => {\r\n const camelKey = toCamelCase(key)\r\n acc[camelKey] = objectKeysToCamelCase(obj[key])\r\n return acc\r\n }, {} as any)\r\n}\r\n","export * from \"./capitalize\"\r\nexport * from \"./truncate\"\r\nexport * from \"./caseConversion\"\r\n\r\nexport function randomStringWithFixedLength(length: number): string {\r\n if (!Number.isInteger(length) || length <= 0) {\r\n throw new Error(\"Length must be a positive integer.\")\r\n }\r\n\r\n return Array.from({ length }, () => Math.random().toString(36)[2]).join(\"\")\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/string/capitalize.ts","../../src/string/truncate.ts","../../src/string/caseConversion/camelToSnake.ts","../../src/string/caseConversion/snakeToCamel.ts","../../src/string/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * Capitalizes the first letter of a string\r\n * @param str - The string to capitalize\r\n * @returns The capitalized string\r\n */\r\nexport function capitalize(str: string): string {\r\n if (typeof str !== 'string') {\r\n throw new Error('Input must be a string');\r\n }\r\n \r\n if (str.length === 0) {\r\n return str;\r\n }\r\n \r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n\r\n/**\r\n * Capitalizes the first letter of each word in a string\r\n * @param str - The string to capitalize\r\n * @returns The string with each word capitalized\r\n */\r\nexport function capitalizeWords(str: string): string {\r\n if (typeof str !== 'string') {\r\n throw new Error('Input must be a string');\r\n }\r\n \r\n return str.replace(/\\b\\w/g, (char) => char.toUpperCase());\r\n}\r\n\r\nexport function convertCamelToNormalCapitalized(\r\n camelCaseString: string\r\n): string {\r\n // Split the camelCase string into words\r\n const words = camelCaseString\r\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\r\n .split(/[\\s_]+/);\r\n\r\n // Capitalize each word\r\n const capitalizedWords = words.map(\r\n (word) => word.charAt(0).toUpperCase() + word.slice(1)\r\n );\r\n\r\n // Join the capitalized words to form the normal capitalized string\r\n const normalCapitalizedString = capitalizedWords.join(\" \");\r\n\r\n return normalCapitalizedString;\r\n}","\r\nexport type TruncateTextOptions = {\r\n text: string;\r\n maxLength?: number;\r\n suffix?: string;\r\n};\r\n\r\nexport function truncateText({\r\n text,\r\n maxLength = 10,\r\n suffix = '...',\r\n}: TruncateTextOptions): string {\r\n return text.length > maxLength\r\n ? text.substring(0, maxLength) + suffix\r\n : text;\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// camelCase → snake_case (string)\r\ntype CamelToSnake<S extends string> = S extends `${infer T}${infer U}`\r\n ? U extends Uncapitalize<U>\r\n ? `${Lowercase<T>}${CamelToSnake<U>}`\r\n : `${Lowercase<T>}_${CamelToSnake<U>}`\r\n : S\r\n\r\nexport type ToSnakeCaseResult<T extends string> = CamelToSnake<T>\r\n// object keys\r\nexport type ObjectKeysToSnakeCaseResult<T> = {\r\n [K in keyof T as CamelToSnake<\r\n Extract<K, string>\r\n >]: T[K] extends readonly any[]\r\n ? ObjectKeysToSnakeCaseResult<T[K][number]>[]\r\n : T[K] extends object\r\n ? ObjectKeysToSnakeCaseResult<T[K]>\r\n : T[K]\r\n}\r\n\r\n/**\r\n * Converts a camelCase string to snake_case\r\n * Handles leading uppercase letters correctly\r\n *\r\n * @example\r\n * toSnakeCase('myVariable') // 'my_variable'\r\n * toSnakeCase('MyVariable') // 'my_variable'\r\n * toSnakeCase('XMLParser') // 'xml_parser'\r\n */\r\nexport const toSnakeCase = <T extends string>(\r\n value: T\r\n): ToSnakeCaseResult<T> => {\r\n return value\r\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1_$2\") // Handle consecutive caps like XMLParser\r\n .replace(/([a-z\\d])([A-Z])/g, \"$1_$2\") // Handle normal camelCase\r\n .toLowerCase() as ToSnakeCaseResult<T>\r\n}\r\n\r\n/**\r\n * Converts all keys in an object from camelCase to snake_case recursively\r\n * Handles nested objects and arrays\r\n *\r\n * @example\r\n * objectKeysToSnakeCase({ firstName: 'John', userInfo: { phoneNumber: '123' } })\r\n * // { first_name: 'John', user_info: { phone_number: '123' } }\r\n */\r\nexport function objectKeysToSnakeCase<T extends Record<string, any>>(\r\n obj: T\r\n): ObjectKeysToSnakeCaseResult<T> {\r\n if (obj === null || typeof obj !== \"object\") return obj as any\r\n if (obj instanceof Date) {\r\n return obj as any\r\n}\r\n if (Array.isArray(obj)) {\r\n return obj.map(objectKeysToSnakeCase) as any\r\n }\r\n\r\n return Object.keys(obj).reduce((acc, key) => {\r\n const snakeKey = toSnakeCase(key)\r\n acc[snakeKey] = objectKeysToSnakeCase(obj[key])\r\n return acc\r\n }, {} as any)\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// Convert snake_case string to camelCase\r\ntype SnakeToCamel<S extends string> = S extends `${infer T}_${infer U}`\r\n ? `${T}${Capitalize<SnakeToCamel<U>>}`\r\n : S;\r\n\r\nexport type ToCamelCaseResult<T extends string> = SnakeToCamel<T>;\r\n\r\nexport type ObjectKeysToCamelCaseResult<\r\n T,\r\n IgnoredPaths extends string = never,\r\n CurrentPath extends string = \"\"\r\n> = T extends readonly any[]\r\n ? ObjectKeysToCamelCaseResult<T[number], IgnoredPaths, CurrentPath>[]\r\n : T extends Date | RegExp | Function\r\n ? T\r\n : T extends object\r\n ? {\r\n [K in keyof T as SnakeToCamel<Extract<K, string>>]:\r\n `${CurrentPath}${CurrentPath extends \"\" ? \"\" : \".\"}${Extract<K, string>}` extends IgnoredPaths\r\n ? T[K] \r\n : ObjectKeysToCamelCaseResult<\r\n T[K],\r\n IgnoredPaths,\r\n `${CurrentPath}${CurrentPath extends \"\" ? \"\" : \".\"}${Extract<K, string>}`\r\n >;\r\n }\r\n : T;\r\n\r\n/**\r\n * Converts a snake_case string to camelCase\r\n */\r\nexport const toCamelCase = <T extends string>(str: T): ToCamelCaseResult<T> => {\r\n return str.replace(/_([a-z])/g, (_, char) =>\r\n char.toUpperCase(),\r\n ) as ToCamelCaseResult<T>;\r\n};\r\n\r\n\r\ntype Options<Paths extends string = string> = {\r\n ignoredPaths?: readonly Paths[];\r\n};\r\n\r\n/**\r\n * Converts all keys in an object from snake_case to camelCase recursively\r\n */\r\nexport function objectKeysToCamelCase<\r\n T extends Record<string, any>,\r\n IgnoredPaths extends string = never\r\n>(\r\n obj: T,\r\n options?: Options<IgnoredPaths>,\r\n currentPath: string = \"\"\r\n): ObjectKeysToCamelCaseResult<T, IgnoredPaths> {\r\n if (obj === null || typeof obj !== \"object\") return obj as any;\r\n\r\n if (\r\n obj instanceof Date ||\r\n obj instanceof RegExp ||\r\n typeof obj === \"function\"\r\n ) {\r\n return obj as any;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map((item, index) =>\r\n objectKeysToCamelCase(\r\n item,\r\n options,\r\n `${currentPath}[${index}]`\r\n )\r\n ) as any;\r\n }\r\n\r\n return Object.keys(obj).reduce((acc, key) => {\r\n const camelKey = toCamelCase(key);\r\n\r\n const nextPath = currentPath\r\n ? `${currentPath}.${key}`\r\n : key;\r\n\r\n if (\r\n options?.ignoredPaths?.some(path =>\r\n nextPath === path || nextPath.startsWith(path + \".\")\r\n )\r\n ) {\r\n acc[camelKey] = obj[key];\r\n return acc;\r\n }\r\n\r\n acc[camelKey] = objectKeysToCamelCase(\r\n obj[key],\r\n options,\r\n nextPath\r\n );\r\n\r\n return acc;\r\n }, {} as any);\r\n}","export * from \"./capitalize\"\r\nexport * from \"./truncate\"\r\nexport * from \"./caseConversion\"\r\n\r\nexport function randomStringWithFixedLength(length: number): string {\r\n if (!Number.isInteger(length) || length <= 0) {\r\n throw new Error(\"Length must be a positive integer.\")\r\n }\r\n\r\n return Array.from({ length }, () => Math.random().toString(36)[2]).join(\"\")\r\n}\r\n"]}
@@ -38,6 +38,9 @@ var toSnakeCase = (value) => {
38
38
  };
39
39
  function objectKeysToSnakeCase(obj) {
40
40
  if (obj === null || typeof obj !== "object") return obj;
41
+ if (obj instanceof Date) {
42
+ return obj;
43
+ }
41
44
  if (Array.isArray(obj)) {
42
45
  return obj.map(objectKeysToSnakeCase);
43
46
  }
@@ -55,14 +58,34 @@ var toCamelCase = (str) => {
55
58
  (_, char) => char.toUpperCase()
56
59
  );
57
60
  };
58
- function objectKeysToCamelCase(obj) {
61
+ function objectKeysToCamelCase(obj, options, currentPath = "") {
59
62
  if (obj === null || typeof obj !== "object") return obj;
63
+ if (obj instanceof Date || obj instanceof RegExp || typeof obj === "function") {
64
+ return obj;
65
+ }
60
66
  if (Array.isArray(obj)) {
61
- return obj.map(objectKeysToCamelCase);
67
+ return obj.map(
68
+ (item, index) => objectKeysToCamelCase(
69
+ item,
70
+ options,
71
+ `${currentPath}[${index}]`
72
+ )
73
+ );
62
74
  }
63
75
  return Object.keys(obj).reduce((acc, key) => {
64
76
  const camelKey = toCamelCase(key);
65
- acc[camelKey] = objectKeysToCamelCase(obj[key]);
77
+ const nextPath = currentPath ? `${currentPath}.${key}` : key;
78
+ if (options?.ignoredPaths?.some(
79
+ (path) => nextPath === path || nextPath.startsWith(path + ".")
80
+ )) {
81
+ acc[camelKey] = obj[key];
82
+ return acc;
83
+ }
84
+ acc[camelKey] = objectKeysToCamelCase(
85
+ obj[key],
86
+ options,
87
+ nextPath
88
+ );
66
89
  return acc;
67
90
  }, {});
68
91
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/string/capitalize.ts","../../src/string/truncate.ts","../../src/string/caseConversion/camelToSnake.ts","../../src/string/caseConversion/snakeToCamel.ts","../../src/string/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Capitalizes the first letter of a string\r\n * @param str - The string to capitalize\r\n * @returns The capitalized string\r\n */\r\nexport function capitalize(str: string): string {\r\n if (typeof str !== 'string') {\r\n throw new Error('Input must be a string');\r\n }\r\n \r\n if (str.length === 0) {\r\n return str;\r\n }\r\n \r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n\r\n/**\r\n * Capitalizes the first letter of each word in a string\r\n * @param str - The string to capitalize\r\n * @returns The string with each word capitalized\r\n */\r\nexport function capitalizeWords(str: string): string {\r\n if (typeof str !== 'string') {\r\n throw new Error('Input must be a string');\r\n }\r\n \r\n return str.replace(/\\b\\w/g, (char) => char.toUpperCase());\r\n}\r\n\r\nexport function convertCamelToNormalCapitalized(\r\n camelCaseString: string\r\n): string {\r\n // Split the camelCase string into words\r\n const words = camelCaseString\r\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\r\n .split(/[\\s_]+/);\r\n\r\n // Capitalize each word\r\n const capitalizedWords = words.map(\r\n (word) => word.charAt(0).toUpperCase() + word.slice(1)\r\n );\r\n\r\n // Join the capitalized words to form the normal capitalized string\r\n const normalCapitalizedString = capitalizedWords.join(\" \");\r\n\r\n return normalCapitalizedString;\r\n}","\r\nexport type TruncateTextOptions = {\r\n text: string;\r\n maxLength?: number;\r\n suffix?: string;\r\n};\r\n\r\nexport function truncateText({\r\n text,\r\n maxLength = 10,\r\n suffix = '...',\r\n}: TruncateTextOptions): string {\r\n return text.length > maxLength\r\n ? text.substring(0, maxLength) + suffix\r\n : text;\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// camelCase → snake_case (string)\r\ntype CamelToSnake<S extends string> = S extends `${infer T}${infer U}`\r\n ? U extends Uncapitalize<U>\r\n ? `${Lowercase<T>}${CamelToSnake<U>}`\r\n : `${Lowercase<T>}_${CamelToSnake<U>}`\r\n : S\r\n\r\nexport type ToSnakeCaseResult<T extends string> = CamelToSnake<T>\r\n// object keys\r\nexport type ObjectKeysToSnakeCaseResult<T> = {\r\n [K in keyof T as CamelToSnake<\r\n Extract<K, string>\r\n >]: T[K] extends readonly any[]\r\n ? ObjectKeysToSnakeCaseResult<T[K][number]>[]\r\n : T[K] extends object\r\n ? ObjectKeysToSnakeCaseResult<T[K]>\r\n : T[K]\r\n}\r\n\r\n/**\r\n * Converts a camelCase string to snake_case\r\n * Handles leading uppercase letters correctly\r\n *\r\n * @example\r\n * toSnakeCase('myVariable') // 'my_variable'\r\n * toSnakeCase('MyVariable') // 'my_variable'\r\n * toSnakeCase('XMLParser') // 'xml_parser'\r\n */\r\nexport const toSnakeCase = <T extends string>(\r\n value: T\r\n): ToSnakeCaseResult<T> => {\r\n return value\r\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1_$2\") // Handle consecutive caps like XMLParser\r\n .replace(/([a-z\\d])([A-Z])/g, \"$1_$2\") // Handle normal camelCase\r\n .toLowerCase() as ToSnakeCaseResult<T>\r\n}\r\n\r\n/**\r\n * Converts all keys in an object from camelCase to snake_case recursively\r\n * Handles nested objects and arrays\r\n *\r\n * @example\r\n * objectKeysToSnakeCase({ firstName: 'John', userInfo: { phoneNumber: '123' } })\r\n * // { first_name: 'John', user_info: { phone_number: '123' } }\r\n */\r\nexport function objectKeysToSnakeCase<T extends Record<string, any>>(\r\n obj: T\r\n): ObjectKeysToSnakeCaseResult<T> {\r\n if (obj === null || typeof obj !== \"object\") return obj as any\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(objectKeysToSnakeCase) as any\r\n }\r\n\r\n return Object.keys(obj).reduce((acc, key) => {\r\n const snakeKey = toSnakeCase(key)\r\n acc[snakeKey] = objectKeysToSnakeCase(obj[key])\r\n return acc\r\n }, {} as any)\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// Convert snake_case string to camelCase\r\ntype SnakeToCamel<S extends string> = S extends `${infer T}_${infer U}`\r\n ? `${T}${Capitalize<SnakeToCamel<U>>}`\r\n : S\r\n\r\nexport type ToCamelCaseResult<T extends string> = SnakeToCamel<T>\r\n\r\n// Convert object keys recursively\r\nexport type ObjectKeysToCamelCaseResult<T> = {\r\n [K in keyof T as SnakeToCamel<\r\n Extract<K, string>\r\n >]: T[K] extends readonly any[]\r\n ? ObjectKeysToCamelCaseResult<T[K][number]>[]\r\n : T[K] extends object\r\n ? ObjectKeysToCamelCaseResult<T[K]>\r\n : T[K]\r\n}\r\n\r\n/**\r\n * Converts a snake_case string to camelCase\r\n *\r\n * @example\r\n * toCamelCase('my_variable') // 'myVariable'\r\n * toCamelCase('user_first_name') // 'userFirstName'\r\n */\r\nexport const toCamelCase = <T extends string>(str: T): ToCamelCaseResult<T> => {\r\n return str.replace(/_([a-z])/g, (_, char) =>\r\n char.toUpperCase()\r\n ) as ToCamelCaseResult<T>\r\n}\r\n\r\n/**\r\n * Converts all keys in an object from snake_case to camelCase recursively\r\n * Handles nested objects and arrays\r\n *\r\n * @example\r\n * objectKeysToCamelCase({ first_name: 'John', user_info: { phone_number: '123' } })\r\n * // { firstName: 'John', userInfo: { phoneNumber: '123' } }\r\n */\r\nexport function objectKeysToCamelCase<T extends Record<string, any>>(\r\n obj: T\r\n): ObjectKeysToCamelCaseResult<T> {\r\n if (obj === null || typeof obj !== \"object\") return obj as any\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(objectKeysToCamelCase) as any\r\n }\r\n\r\n return Object.keys(obj).reduce((acc, key) => {\r\n const camelKey = toCamelCase(key)\r\n acc[camelKey] = objectKeysToCamelCase(obj[key])\r\n return acc\r\n }, {} as any)\r\n}\r\n","export * from \"./capitalize\"\r\nexport * from \"./truncate\"\r\nexport * from \"./caseConversion\"\r\n\r\nexport function randomStringWithFixedLength(length: number): string {\r\n if (!Number.isInteger(length) || length <= 0) {\r\n throw new Error(\"Length must be a positive integer.\")\r\n }\r\n\r\n return Array.from({ length }, () => Math.random().toString(36)[2]).join(\"\")\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/string/capitalize.ts","../../src/string/truncate.ts","../../src/string/caseConversion/camelToSnake.ts","../../src/string/caseConversion/snakeToCamel.ts","../../src/string/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Capitalizes the first letter of a string\r\n * @param str - The string to capitalize\r\n * @returns The capitalized string\r\n */\r\nexport function capitalize(str: string): string {\r\n if (typeof str !== 'string') {\r\n throw new Error('Input must be a string');\r\n }\r\n \r\n if (str.length === 0) {\r\n return str;\r\n }\r\n \r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n\r\n/**\r\n * Capitalizes the first letter of each word in a string\r\n * @param str - The string to capitalize\r\n * @returns The string with each word capitalized\r\n */\r\nexport function capitalizeWords(str: string): string {\r\n if (typeof str !== 'string') {\r\n throw new Error('Input must be a string');\r\n }\r\n \r\n return str.replace(/\\b\\w/g, (char) => char.toUpperCase());\r\n}\r\n\r\nexport function convertCamelToNormalCapitalized(\r\n camelCaseString: string\r\n): string {\r\n // Split the camelCase string into words\r\n const words = camelCaseString\r\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\r\n .split(/[\\s_]+/);\r\n\r\n // Capitalize each word\r\n const capitalizedWords = words.map(\r\n (word) => word.charAt(0).toUpperCase() + word.slice(1)\r\n );\r\n\r\n // Join the capitalized words to form the normal capitalized string\r\n const normalCapitalizedString = capitalizedWords.join(\" \");\r\n\r\n return normalCapitalizedString;\r\n}","\r\nexport type TruncateTextOptions = {\r\n text: string;\r\n maxLength?: number;\r\n suffix?: string;\r\n};\r\n\r\nexport function truncateText({\r\n text,\r\n maxLength = 10,\r\n suffix = '...',\r\n}: TruncateTextOptions): string {\r\n return text.length > maxLength\r\n ? text.substring(0, maxLength) + suffix\r\n : text;\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// camelCase → snake_case (string)\r\ntype CamelToSnake<S extends string> = S extends `${infer T}${infer U}`\r\n ? U extends Uncapitalize<U>\r\n ? `${Lowercase<T>}${CamelToSnake<U>}`\r\n : `${Lowercase<T>}_${CamelToSnake<U>}`\r\n : S\r\n\r\nexport type ToSnakeCaseResult<T extends string> = CamelToSnake<T>\r\n// object keys\r\nexport type ObjectKeysToSnakeCaseResult<T> = {\r\n [K in keyof T as CamelToSnake<\r\n Extract<K, string>\r\n >]: T[K] extends readonly any[]\r\n ? ObjectKeysToSnakeCaseResult<T[K][number]>[]\r\n : T[K] extends object\r\n ? ObjectKeysToSnakeCaseResult<T[K]>\r\n : T[K]\r\n}\r\n\r\n/**\r\n * Converts a camelCase string to snake_case\r\n * Handles leading uppercase letters correctly\r\n *\r\n * @example\r\n * toSnakeCase('myVariable') // 'my_variable'\r\n * toSnakeCase('MyVariable') // 'my_variable'\r\n * toSnakeCase('XMLParser') // 'xml_parser'\r\n */\r\nexport const toSnakeCase = <T extends string>(\r\n value: T\r\n): ToSnakeCaseResult<T> => {\r\n return value\r\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1_$2\") // Handle consecutive caps like XMLParser\r\n .replace(/([a-z\\d])([A-Z])/g, \"$1_$2\") // Handle normal camelCase\r\n .toLowerCase() as ToSnakeCaseResult<T>\r\n}\r\n\r\n/**\r\n * Converts all keys in an object from camelCase to snake_case recursively\r\n * Handles nested objects and arrays\r\n *\r\n * @example\r\n * objectKeysToSnakeCase({ firstName: 'John', userInfo: { phoneNumber: '123' } })\r\n * // { first_name: 'John', user_info: { phone_number: '123' } }\r\n */\r\nexport function objectKeysToSnakeCase<T extends Record<string, any>>(\r\n obj: T\r\n): ObjectKeysToSnakeCaseResult<T> {\r\n if (obj === null || typeof obj !== \"object\") return obj as any\r\n if (obj instanceof Date) {\r\n return obj as any\r\n}\r\n if (Array.isArray(obj)) {\r\n return obj.map(objectKeysToSnakeCase) as any\r\n }\r\n\r\n return Object.keys(obj).reduce((acc, key) => {\r\n const snakeKey = toSnakeCase(key)\r\n acc[snakeKey] = objectKeysToSnakeCase(obj[key])\r\n return acc\r\n }, {} as any)\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// Convert snake_case string to camelCase\r\ntype SnakeToCamel<S extends string> = S extends `${infer T}_${infer U}`\r\n ? `${T}${Capitalize<SnakeToCamel<U>>}`\r\n : S;\r\n\r\nexport type ToCamelCaseResult<T extends string> = SnakeToCamel<T>;\r\n\r\nexport type ObjectKeysToCamelCaseResult<\r\n T,\r\n IgnoredPaths extends string = never,\r\n CurrentPath extends string = \"\"\r\n> = T extends readonly any[]\r\n ? ObjectKeysToCamelCaseResult<T[number], IgnoredPaths, CurrentPath>[]\r\n : T extends Date | RegExp | Function\r\n ? T\r\n : T extends object\r\n ? {\r\n [K in keyof T as SnakeToCamel<Extract<K, string>>]:\r\n `${CurrentPath}${CurrentPath extends \"\" ? \"\" : \".\"}${Extract<K, string>}` extends IgnoredPaths\r\n ? T[K] \r\n : ObjectKeysToCamelCaseResult<\r\n T[K],\r\n IgnoredPaths,\r\n `${CurrentPath}${CurrentPath extends \"\" ? \"\" : \".\"}${Extract<K, string>}`\r\n >;\r\n }\r\n : T;\r\n\r\n/**\r\n * Converts a snake_case string to camelCase\r\n */\r\nexport const toCamelCase = <T extends string>(str: T): ToCamelCaseResult<T> => {\r\n return str.replace(/_([a-z])/g, (_, char) =>\r\n char.toUpperCase(),\r\n ) as ToCamelCaseResult<T>;\r\n};\r\n\r\n\r\ntype Options<Paths extends string = string> = {\r\n ignoredPaths?: readonly Paths[];\r\n};\r\n\r\n/**\r\n * Converts all keys in an object from snake_case to camelCase recursively\r\n */\r\nexport function objectKeysToCamelCase<\r\n T extends Record<string, any>,\r\n IgnoredPaths extends string = never\r\n>(\r\n obj: T,\r\n options?: Options<IgnoredPaths>,\r\n currentPath: string = \"\"\r\n): ObjectKeysToCamelCaseResult<T, IgnoredPaths> {\r\n if (obj === null || typeof obj !== \"object\") return obj as any;\r\n\r\n if (\r\n obj instanceof Date ||\r\n obj instanceof RegExp ||\r\n typeof obj === \"function\"\r\n ) {\r\n return obj as any;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map((item, index) =>\r\n objectKeysToCamelCase(\r\n item,\r\n options,\r\n `${currentPath}[${index}]`\r\n )\r\n ) as any;\r\n }\r\n\r\n return Object.keys(obj).reduce((acc, key) => {\r\n const camelKey = toCamelCase(key);\r\n\r\n const nextPath = currentPath\r\n ? `${currentPath}.${key}`\r\n : key;\r\n\r\n if (\r\n options?.ignoredPaths?.some(path =>\r\n nextPath === path || nextPath.startsWith(path + \".\")\r\n )\r\n ) {\r\n acc[camelKey] = obj[key];\r\n return acc;\r\n }\r\n\r\n acc[camelKey] = objectKeysToCamelCase(\r\n obj[key],\r\n options,\r\n nextPath\r\n );\r\n\r\n return acc;\r\n }, {} as any);\r\n}","export * from \"./capitalize\"\r\nexport * from \"./truncate\"\r\nexport * from \"./caseConversion\"\r\n\r\nexport function randomStringWithFixedLength(length: number): string {\r\n if (!Number.isInteger(length) || length <= 0) {\r\n throw new Error(\"Length must be a positive integer.\")\r\n }\r\n\r\n return Array.from({ length }, () => Math.random().toString(36)[2]).join(\"\")\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digicroz/js-kit",
3
- "version": "1.0.14",
3
+ "version": "1.0.17",
4
4
  "description": "Modern TypeScript utility library with tree-shaking support - Array, String, Number, Sleep, and Time utilities for JavaScript and TypeScript projects",
5
5
  "keywords": [
6
6
  "typescript",