Skip to content

Commit 97943f5

Browse files
committed
add CamelPascalToSnakeCase conversion
1 parent 9010481 commit 97943f5

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

Conversions/CamelPascalToSnakeCase.js

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* Transforms a camelCase (or PascalCase) string to snake_case
3+
* @param {string} inputStr camelCase or PascalCase string
4+
* @returns { string } snake_case string
5+
*/
6+
7+
function camelPascalToSnakeCase(inputStr) {
8+
if (typeof inputStr !== "string") {
9+
throw new Error(`Expected string as input, found ${typeof inputStr}`);
10+
}
11+
12+
let snakeStr = "";
13+
let lastCharWasLower = false;
14+
15+
for (let index = 0; index < inputStr.length; index++) {
16+
const char = inputStr[index];
17+
18+
if (/[A-Z]/.test(char) && (!lastCharWasLower || (index > 0 && /[a-z0-9]/.test(inputStr[index - 1])))) {
19+
if (index > 0 && inputStr[index - 1] !== "_") {
20+
snakeStr += "_";
21+
}
22+
snakeStr += char.toLowerCase();
23+
lastCharWasLower = false;
24+
} else if (/[a-z0-9]/.test(char)) {
25+
snakeStr += char;
26+
lastCharWasLower = /[a-z]/.test(char);
27+
} else {
28+
snakeStr += "_";
29+
lastCharWasLower = false;
30+
}
31+
}
32+
33+
// Remove leading underscore
34+
if (snakeStr[0] === "_") {
35+
snakeStr = snakeStr.substring(1);
36+
}
37+
38+
return snakeStr;
39+
}
40+
41+
export { camelPascalToSnakeCase }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { camelPascalToSnakeCase } from "../CamelPascalToSnakeCase";
2+
3+
describe('camelToSnakeCase', () => {
4+
it.each([
5+
['someRandomString', 'some_random_string'],
6+
['SomeRandomStr#ng', 'some_random_str_ng'],
7+
['123someRandom123String123', '123some_random123_string123'],
8+
['123SomeRandom123String123', '123_some_random123_string123'],
9+
['123SomeRandom123String123', '123_some_random123_string123'],
10+
['', ''],
11+
])('converts %s to snake_case %s', (input, expected) => {
12+
expect(camelPascalToSnakeCase(input)).toBe(expected);
13+
});
14+
15+
it('throws an error when the input is not a string', () => {
16+
expect(() => camelPascalToSnakeCase(123)).toThrow('Expected string as input');
17+
});
18+
});

0 commit comments

Comments
 (0)