summaryrefslogtreecommitdiffhomepage
path: root/gui/src/main/transform-object-keys.ts
blob: 82b82793ec7838a0f1edf8493a79d0c293ce5168 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function pascalCaseToCamelCaseImpl(str: string): string {
  return str.charAt(0).toLowerCase() + str.slice(1);
}

function snakeCaseToCamelCaseImpl(str: string): string {
  return str.replace(/_([a-z])/gi, (matches) => matches[1].toUpperCase());
}

function camelCaseToSnakeCaseImpl(str: string): string {
  return str
    .replace(/[a-z0-9][A-Z]/g, (matches) => `${matches[0]}_${matches[1].toLowerCase()}`)
    .toLowerCase();
}

// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function pascalCaseToCamelCase<T>(anObject: { [key: string]: any }): T {
  return transformObjectKeys(anObject, pascalCaseToCamelCaseImpl) as T;
}

// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function snakeCaseToCamelCase<T>(anObject: { [key: string]: any }): T {
  return transformObjectKeys(anObject, snakeCaseToCamelCaseImpl) as T;
}

export function camelCaseToSnakeCase<T>(anObject: T): Record<string, unknown> {
  return transformObjectKeys(anObject, camelCaseToSnakeCaseImpl);
}

function transformObjectKeys(
  anObject: { [key: string]: any }, // eslint-disable-line @typescript-eslint/no-explicit-any
  keyTransformer: (key: string) => string,
) {
  for (const sourceKey of Object.keys(anObject)) {
    const targetKey = keyTransformer(sourceKey);
    const sourceValue = anObject[sourceKey];

    anObject[targetKey] =
      sourceValue !== null && typeof sourceValue === 'object'
        ? transformObjectKeys(sourceValue, keyTransformer)
        : sourceValue;

    if (sourceKey !== targetKey) {
      delete anObject[sourceKey];
    }
  }
  return anObject;
}