-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.ts
145 lines (122 loc) · 3.81 KB
/
index.ts
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
export const parseToPascalCase = function (
jsonString: string,
parseOptions: Partial<ParseOptions> = {}
): any {
function pascalCaseReviver(_key: string, value: any) {
if (value && typeof value === "object") {
for (var k in value) {
if (Object.hasOwnProperty.call(value, k)) {
let newKey = k;
let hasChange = false;
if (/^[a-z]/.test(k)) {
newKey = k.charAt(0).toUpperCase() + k.substring(1);
hasChange = true;
}
if (parseOptions?.parseFromSnakeCase && /[_]/.test(newKey)) {
newKey = snakeToPascal(newKey);
hasChange = true;
}
if (parseOptions?.parseFromKebapCase && /[-]/.test(newKey)) {
newKey = kebapToPascal(newKey);
hasChange = true;
}
if (hasChange) {
value[newKey] = value[k];
delete value[k];
}
}
}
}
return value;
}
return JSON.parse(jsonString, pascalCaseReviver);
};
export const parseToCamelCase = function (
jsonString: string,
parseOptions: Partial<ParseOptions> = {}
): any {
function toCamelCaseReviver(_key: string, value: any) {
if (value && typeof value === "object") {
for (var k in value) {
if (Object.hasOwnProperty.call(value, k)) {
let newKey = toCamelCase(k);
let hasChange = newKey != k;
if (parseOptions?.parseFromSnakeCase && /[_]/.test(newKey)) {
newKey = snakeToCamel(newKey);
hasChange = true;
}
if (parseOptions?.parseFromKebapCase && /[-]/.test(newKey)) {
newKey = kebapToCamel(newKey);
hasChange = true;
}
if (hasChange) {
value[newKey] = value[k];
delete value[k];
}
}
}
}
return value;
}
return JSON.parse(jsonString, toCamelCaseReviver);
};
export const snakeToCamel = (str: string) =>
str.replace(/([_]\w)/g, (g) => g[1].toUpperCase());
export const kebapToCamel = (str: string) =>
str.replace(/([-]\w)/g, (g) => g[1].toUpperCase());
export const snakeToPascal = (str: string) => {
let camelCase = snakeToCamel(str);
let pascalCase = camelCase[0].toUpperCase() + camelCase.substr(1);
return pascalCase;
};
export const kebapToPascal = (str: string) => {
let camelCase = kebapToCamel(str);
let pascalCase = camelCase[0].toUpperCase() + camelCase.substr(1);
return pascalCase;
};
export type ParseOptions = {
parseFromSnakeCase: boolean;
parseFromKebapCase: boolean;
};
export function toCamelCase(s: string): string {
if (!s || !isUpper(s[0])) {
return s;
}
const chars: string[] = s.split("");
for (let i = 0; i < chars.length; i++) {
if (i == 1 && !isUpper(chars[i])) {
break;
}
const hasNext: boolean = i + 1 < chars.length;
if (i > 0 && hasNext && !isUpper(chars[i + 1])) {
// if the next character is a space, which is not considered uppercase
// (otherwise we wouldn't be here...)
// we want to ensure that the following:
// 'FOO bar' is rewritten as 'foo bar', and not as 'foO bar'
// The code was written in such a way that the first word in uppercase
// ends when if finds an uppercase letter followed by a lowercase letter.
// now a ' ' (space, (char)32) is considered not upper
// but in that case we still want our current character to become lowercase
if (isSeparator(chars[i + 1])) {
chars[i] = chars[i].toLowerCase();
}
break;
}
chars[i] = chars[i].toLowerCase();
}
return chars.join("");
}
function isUpper(char: string) {
return char[0].toUpperCase() == char[0];
}
function isSeparator(c: string): boolean {
switch (c) {
case "}":
case "]":
case ",":
case " ":
case "\t":
return true;
}
return false;
}